1. Apakah fungsi tanpa nama?
Secara amnya terdapat tiga cara untuk mentakrifkan fungsi dalam Javascript:
Pernyataan kata kunci (fungsi) fungsi:
fungsi fnMethodName(x){alert(x);}
Fungsi Huruf:
var fnMethodName = function(x){alert(x); }
Fungsi() pembina:
var fnMethodName = new Function('x','alert(x);')
Tiga kaedah di atas mentakrifkan fungsi kaedah yang sama fnMethodName, yang pertama adalah yang paling Kaedah yang biasa digunakan, dua yang terakhir menyalin fungsi ke fnMethodName pembolehubah, dan fungsi ini tidak mempunyai nama, iaitu, fungsi tanpa nama. Malah, beberapa bahasa mempunyai fungsi tanpa nama.
2. Perbezaan antara fungsi literal dan Function() constructor
Walaupun fungsi literal ialah fungsi tanpa nama, sintaks membolehkan anda menentukan sebarang nama fungsi untuknya Fungsi rekursif boleh memanggil dirinya sendiri, tetapi menggunakan pembina Function() tidak boleh.
var f = function fact(x) {
jika (x < = 1) mengembalikan 1;
selain mengembalikan x*fact(x-1); penciptaan dan penyusunan dinamik. Dengan cara ini ia serupa dengan fungsi global eval().
Pembina Function() menghuraikan badan fungsi dan mencipta objek fungsi baharu setiap kali ia dilaksanakan. Oleh itu, kecekapan memanggil pembina Function() dalam gelung atau fungsi yang kerap dilaksanakan adalah sangat rendah. Sebaliknya, literal fungsi tidak disusun semula setiap kali ia ditemui.
Apabila anda mencipta fungsi menggunakan pembina Function(), ia tidak mengikut skop biasa Ia sentiasa melaksanakannya sebagai fungsi peringkat atas.
Salin kod
return new Function("return y"); // Tidak dapat memperoleh pembolehubah setempat
}
alert(constructFunction()() ); // Output "global"
Berbanding dengan definisi kata kunci fungsi, pembina Function() mempunyai ciri tersendiri dan lebih sukar untuk digunakan, jadi teknik ini biasanya jarang digunakan. Ungkapan literal fungsi sangat hampir dengan definisi kata kunci fungsi. Memandangkan perbezaan sebelumnya, walaupun terdapat berita bahawa fungsi tanpa nama literal mempunyai pepijat dalam sesetengah enjin webkit di bawah OS X 10.4.3, fungsi tanpa nama yang biasanya kita rujuk kepada fungsi tanpa nama dalam bentuk literal fungsi. Untuk butiran lanjut, anda boleh membaca bab Fungsi "JavaScript: Panduan Definitif, Edisi Ke-5".
3. Corak kod fungsi tanpa nama
Semalam hedger wang memperkenalkan beberapa corak kod fungsi tanpa nama pada blognya:
Mod ralat: Ia tidak boleh berfungsi, penyemak imbas akan melaporkan ralat sintaks.
Salin kod
Kod adalah seperti berikut: function(){ alert( 1); }();
Fungsi literal: mula-mula mengisytiharkan objek fungsi, dan kemudian melaksanakannya.
Salin kod
Kod adalah seperti berikut: (function(){ alert (1) ; } ) ( );
Ungkapan keutamaan: Memandangkan Javascript melaksanakan ungkapan dari dalam kurungan ke luar, anda boleh menggunakan kurungan untuk memaksa pelaksanaan fungsi yang diisytiharkan .
Salin kod
Pengendali void: Gunakan operator kosong untuk melaksanakan satu operan yang tidak dikelilingi oleh kurungan.
Salin kod