Pertanyaan Apa tujuan menyampaikan argumen kepada fungsi anonim dengan cara ini? [duplikat]


Kemungkinan Duplikat:
Bagaimana cara kerja JavaScript ditutup? 

Saya bermain-main dengan Google Closure Compiler, memasukkan kode acak untuk melihat apa yang akan dilakukan.

Ini menulis ulang salah satu fungsi saya untuk terlihat seperti ini:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​

Di mana itu muncul itu "Hello World" adalah argumen yang diloloskan sebagai msg ke fungsi anonim yang mendahuluinya. Saya melihat itu sejenak, dan berpikir bahwa saya telah melihat sesuatu yang mirip dalam plugin jQuery yang terlihat seperti:

(function( $ ) {
  ...
})(jQuery); 

Yang sekarang lebih masuk akal bagi saya, dalam ruang lingkup konflik dengan $. Tapi apa alasan utama atau tujuan untuk menyampaikan argumen ke dalam fungsi anonim seperti ini? Mengapa Anda tidak hanya mendefinisikan argumen sebagai variabel dalam fungsi? Apakah ada keunggulan kinerja atau fleksibilitas untuk menulis fungsi seperti ini?


32
2017-10-02 21:23


asal


Jawaban:


Ada satu perbedaan signifikan yang terhubung juga dengan ruang lingkup. Kode berikut:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​

dalam beberapa keadaan lebih bersih dalam hal polusi namespace daripada ini:

var msg = "Hello World!";
console.log(msg);

karena kode kedua meninggalkan variabel setelah tidak lagi diperlukan, tetapi dapat mengganggu bagian lain dari kode.

Ini sangat penting ketika Anda menjalankan kode yang disebutkan di luar fungsi lainnya: dalam hal demikian msg variabel akan tersedia di mana-mana di halaman, sebagai variabel global.


10
2017-10-02 21:27



Pada dasarnya, itu selalu ide yang baik untuk menjaga kode Anda dibungkus dalam ini: (function(){/*code*/}()); untuk mencegah vars Anda bertabrakan dengan vars orang lain.

Saya pikir hal utama yang harus dilakukan oleh kompilator closure adalah menyimpan 5 karakter:var  dan =.


0
2017-10-02 21:34



Itu tergantung sedikit pada konteksnya. Ada beberapa kondisi di mana compiler tidak akan mencoba untuk menyejajarkan fungsi apa pun sama sekali (jika fungsi scoping berisi "eval" misalnya). Jika ini adalah dalam lingkup global dan Anda menjalankan dalam mode ADVANCED, itu hanya bahwa peluang inlining muncul setelah kompiler berhenti mencoba fungsi inline (atau ada bug dalam kode inline dan itu kehilangan kesempatan). Jika Anda menjalankan output sampel Anda melalui compiler dalam mode ADVANCED, Anda mendapatkan ini:

console.log("Hello World!");

0
2017-10-03 01:02