1. Ini disebut fungsi anonim yang segera berjalan (juga disebut fungsi yang segera memanggil)
2. Ketika fungsi anonim tertutup dan kemudian braket ditambahkan ke belakang, fungsi anonim dapat dijalankan segera! Apakah ada sesuatu yang ajaib?
3. Untuk menggunakan suatu fungsi, pertama -tama kita harus menyatakan keberadaannya. Cara paling umum yang kami gunakan adalah mendefinisikan fungsi menggunakan fungsi fungsi
4. Objek fungsi
Objek fungsi adalah objek yang melekat dalam JavaScript, dan semua fungsi sebenarnya adalah objek fungsi.
Mari kita lihat apakah objek fungsi dapat secara langsung menggunakan konstruktor untuk membuat fungsi baru? Jawabannya adalah ya.
var abc = fungsi baru ("x", "y", "return x*y;"); peringatan (ABC (2,3)); // "6"5. Fungsi anonim tidak memiliki nama, jadi itu diperluas ke pertanyaan tentang bagaimana kita harus menyebutnya (O_O)?
Panggilan fungsi anonim①
var abc = function (x, y) {return x+y; } peringatan (ABC (2,3)); // "5"Operasi di atas sebenarnya setara dengan mendefinisikan fungsi dengan cara yang berbeda. Penggunaan ini adalah sesuatu yang lebih sering kita temui.
Misalnya, ketika kami mengatur fungsi penangan acara elemen DOM, kami biasanya tidak menyebutkan nama mereka, tetapi sebaliknya memberikan acara yang sesuai dengan fungsi anonim.
Memanggil fungsi anonim②
Gunakan () untuk melampirkan fungsi anonim, dan kemudian menambahkan sepasang tanda kurung (termasuk daftar parameter).
waspada ((fungsi baru ("x", "y", "return x*y;")) (2,3)); // "6"6. Apa peran tanda kurung?
Kurung dapat membagi ekspresi kami menjadi potongan -potongan, dan setiap bagian, yaitu, masing -masing pasangan kawat gigi, memiliki nilai pengembalian. Nilai pengembalian ini sebenarnya adalah nilai pengembalian ekspresi dalam tanda kurung.
Oleh karena itu, ketika kami melampirkan fungsi anonim dengan sepasang tanda kurung, tanda kurung mengembalikan objek fungsi dari fungsi anonim.
Oleh karena itu, menambahkan fungsi anonim ke pasangan braket seperti fungsi bernama dan kami mendapatkan posisi referensi. Jadi, jika Anda menambahkan daftar parameter setelah variabel referensi ini, bentuk panggilan fungsi biasa akan diimplementasikan.
7. 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 itu
1. Ketika mesin JavaScript mem -parsing kode JavaScript, ia akan 'fungsi deklarasi yang diangkat' (fungsi deklarasi yang diangkat) 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 itu. Deklarasi fungsi tidak dapat dilakukan dan hanya dapat dipanggil dalam bentuk fnname ().
Chestnut①
fnname (); function fnname () {...} // normal, karena 'mempromosikan' deklarasi fungsi, panggilan fungsi dapat menjadi fnname (); var fnname = function () {...} // Kesalahan yang dilaporkan, variabel fnname belum menyimpan referensi ke fungsi, dan fungsi fungsi harus dilakukan setelah fungsi ekspresi harus dilakukan setelah fungsi tersebut harus dilakukan setelah fungsi.Chestnut②
var fnname = function () {alert ('hello world');} (); // parsel ditambahkan setelah ekspresi fungsi. Ketika mesin JavaScript diuraikan di sini, fungsi dapat dipanggil segera ketika mesin JavaScript diarahkan di sini berfungsi fnname () {alert ('Hello World');} (); // Tidak akan ada kesalahan, tetapi mesin JavaScript hanya mem -parsing fungsi, hal yang disebut fungsi selanjutnya, dan fungsi -fungsi yang diselingi, dan fungsi selanjutnya, dan fungsi selanjutnya, dan fungsi selanjutnya, dan fungsi selanjutnya, dan fungsi selanjutnya. } (); // 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 diperlukanJika Anda ingin menambahkan kurung setelah badan fungsi, Anda dapat segera memanggilnya, maka fungsi ini harus berupa ekspresi fungsi, bukan deklarasi fungsi.
Chestnut③
(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 // 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.