Javascript lebih kasual dibandingkan dengan bahasa pemrograman lainnya, jadi kode JavaScript penuh dengan semua jenis metode penulisan yang aneh. Terkadang Anda bisa melihat bunga di kabut. Tentu saja, mampu memahami berbagai jenis metode penulisan juga merupakan pemahaman mendalam lebih lanjut tentang karakteristik bahasa JavaScript.
(function () {...}) () dan (function () {...} ()) adalah dua cara umum untuk segera menjalankan fungsi dalam JavaScript. Pada awalnya saya pikir itu adalah fungsi anonim yang dibungkus dengan braket, dan kemudian menambahkan braket untuk memanggil fungsi. Akhirnya, saya mencapai tujuan menjalankannya segera setelah fungsi didefinisikan. Kemudian, saya menemukan bahwa alasan menambahkan kurung tidak terjadi. Untuk memahami pelaksanaan fungsi segera, Anda harus terlebih dahulu memahami beberapa konsep dasar fungsi.
Deklarasi fungsi, ekspresi fungsi, fungsi anonim
Deklarasi fungsi: fungsi fnname () {...}; Gunakan kata kunci fungsi untuk mendeklarasikan fungsi, dan kemudian tentukan nama fungsi, yang disebut deklarasi fungsi.
Ekspresi fungsi var fnname = function () {...}; mendeklarasikan fungsi menggunakan kata kunci fungsi, tetapi tidak memberi nama fungsi. Akhirnya, fungsi anonim diberi variabel, yang disebut ekspresi fungsi, yang merupakan bentuk sintaks ekspresi fungsi yang paling umum.
Fungsi anonim: function () {}; Gunakan kata kunci fungsi untuk mendeklarasikan fungsi, tetapi fungsi tidak disebutkan, jadi itu disebut fungsi anonim. Fungsi anonim milik ekspresi fungsi. Fungsi anonim memiliki banyak fungsi. Jika Anda menetapkan variabel, Anda membuat fungsi, dan jika Anda menetapkan suatu acara, Anda menjadi penangan acara atau membuat penutupan, dll.
Perbedaan antara deklarasi fungsi dan ekspresi fungsi adalah bahwa 1. Ketika mem -parsing kode JavaScript, mesin JavaScript akan 'Fungsi Deklarasi Promosi' (Fungsi Deklarasi Mengangkat) Fungsi Deklarasi pada Lingkungan Eksekusi Saat Ini (Lingkup). Ekspresi fungsi harus menunggu sampai mesin Javascirtp dijalankan ke garisnya sebelum mem -parsing ekspresi fungsi dari atas ke garis bawah. 2. Ekspresi fungsi dapat dipanggil segera dengan tanda kurung setelah ekspresi fungsi. Deklarasi fungsi tidak dapat dilakukan dan hanya dapat dipanggil dalam bentuk fnname (). Berikut adalah dua contoh perbedaan antara keduanya.
fnname (); function fnname () {...} // normal, karena 'mempromosikan' deklarasi fungsi, panggilan fungsi dapat menjadi fnname (); var fnname = function () {...} // Kesalahan dilaporkan, variabel fnname belum menyimpan referensi ke fungsi, dan fungsi fungsi harus setelah ekspresi tersebut harus dilakukan setelah ekspresi tersebut harus dilakukan setelah fungsi setelah fungsi. var fnname = function () {alert ('hello world');} (); // parsel ditambahkan setelah ekspresi fungsi. Ketika mesin JavaScript diuraikan di sini, fungsi dapat disebut segera berfungsi fnname () {waspada ('Hello World');} (); // Tidak akan ada kesalahan, tetapi mesin JavaScript hanya mem -parsing fungsi deklarasi, mengabaikan kurung selanjutnya, dan deklarasi fungsi tidak akan disebut fungsi () {console. Console. } (); // Kesalahan sintaks, meskipun fungsi anonim termasuk dalam ekspresi fungsi, tidak ada operasi penugasan yang dilakukan, // Jadi mesin JavaScript memperlakukan kata kunci fungsi di awal sebagai deklarasi fungsi, dan melaporkan kesalahan: nama fungsi diperlukanSetelah memahami beberapa konsep fungsi dasar, saya melihat kembali dua cara untuk menulis (function () {...}) () dan (function () {...} ()) segera. Pada awalnya saya pikir itu adalah fungsi anonim yang dibungkus dalam braket dan menambahkan braket untuk segera memanggil fungsi. Pada saat itu, saya tidak tahu mengapa saya harus menambahkan kurung. Kemudian saya menyadari bahwa jika saya harus menambahkan tanda kurung setelah tubuh fungsi, saya bisa segera memanggilnya. Maka fungsi ini harus berupa ekspresi fungsi, bukan deklarasi fungsi.
(function (a) {console.log (a); // firebug output 123, gunakan operator ()}) (123); (function (a) {console.log (a); // firebug output 1234, gunakan operator ()} (1234)); function (a) {console.log (a); // Output Firebug 12345, gunakan! Operator} (12345); +function (a) {console.log (a); // Output Firebug 123456, gunakan + operator} (123456); -function (a) {console.log (a); // Output Firebug 1234567, gunakan - operator} (1234567); var fn = fungsi (a) {console.log (a); // Output Firebug 12345678, gunakan operator =} (12345678)Anda dapat melihat hasil output dan menambahkannya sebelum fungsi! , +, - dan bahkan koma dapat digunakan untuk mengeksekusi segera setelah fungsi didefinisikan, dan (),! Operator seperti +, -, = Konversi deklarasi fungsi menjadi ekspresi fungsi, menghilangkan ambiguitas antara mesin JavaScript yang mengidentifikasi ekspresi fungsi dan deklarasi fungsi, memberi tahu mesin JavaScript bahwa ini adalah ekspresi fungsi, bukan deklarasi fungsi, Anda dapat menambahkan kurung setelahnya dan menjalankan kode fungsi segera.
Menambahkan kurung adalah cara teraman untuk melakukannya, karena! Operator seperti, +, dan - juga akan melakukan operasi dengan nilai pengembalian fungsi, yang terkadang menyebabkan masalah yang tidak perlu.
Tapi apa gunanya menulis dengan cara ini?
Tidak ada konsep ruang lingkup pribadi di JavaScript. Jika Anda mendeklarasikan beberapa variabel dalam ruang lingkup global atau lokal pada proyek yang dikembangkan oleh banyak orang, itu mungkin ditimpa oleh orang lain dengan nama yang sama. Menurut karakteristik rantai ruang lingkup fungsi JavaScript, teknik ini dapat digunakan untuk meniru ruang lingkup pribadi dan menggunakan fungsi anonim sebagai "wadah". "Wadah" dapat mengakses variabel eksternal, sedangkan lingkungan eksternal tidak dapat mengakses variabel di dalam "wadah", sehingga variabel yang didefinisikan di dalam (fungsi () {...}) () tidak akan bertentangan dengan variabel eksternal, umumnya dikenal sebagai "pembungkus anonim" atau "namespace".
JQuery menggunakan metode ini. Saat kode jQuery dibungkus (fungsi (jendela, tidak terdefinisi) {... kode jQuery ...} (jendela), ia dapat melindungi variabel internal jQuery saat memanggil kode jQuery dalam lingkup global.
Artikel ini adalah pemahaman dan kompilasi pribadi. Jika ada kesalahan, silakan tunjukkan. Pandangan dalam artikel dirujuk dari:
"Panduan otoritatif untuk JavaScript" dan "Programming Advanced"