Ungkapan fungsi dan pengisytiharan fungsi
Dalam ECMAScript, dua cara paling biasa untuk mencipta fungsi ialah ungkapan fungsi dan pengisytiharan fungsi Perbezaan antara kedua-duanya agak mengelirukan, kerana spesifikasi ECMA hanya menjelaskan satu perkara: pengisytiharan fungsi mesti mempunyai pengecam (Pengecam). ) (iaitu semua orang sering memanggil nama fungsi), dan pengecam ini boleh ditinggalkan dalam ungkapan fungsi:
Pengisytiharan fungsi:
nama fungsi fungsi (parameter: pilihan){function body}
Ungkapan fungsi:
nama fungsi fungsi (pilihan) (parameter: pilihan) {function body}
Jadi, boleh dilihat bahawa jika nama fungsi tidak diisytiharkan, ia mestilah ungkapan Tetapi jika nama fungsi diisytiharkan, bagaimana untuk menentukan sama ada ia adalah pengisytiharan fungsi atau ungkapan fungsi? ECMAScript membezakan mengikut konteks Jika function foo(){} ialah sebahagian daripada ungkapan tugasan, ia adalah ungkapan fungsi Jika function foo(){} terkandung dalam badan fungsi, atau terletak dalam program Di bahagian atas, ia adalah. pengisytiharan fungsi.
function foo(){} // 声明,因为它是程序的一部分 var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分 new function bar(){}; // 表达式,因为它是new表达式 (function(){ function bar(){} // 声明,因为它是函数体的一部分 })();
Terdapat juga ungkapan fungsi yang kurang biasa, iaitu yang disertakan dengan kurungan (function foo(){} Sebab mengapa ia merupakan ungkapan adalah kerana kurungan () ialah pengendali pengelompokan, dan termasuk dalamannya ungkapan, mari lihat beberapa contoh:
function foo(){} // Pengisytiharan fungsi
(function foo(){}); // Ungkapan fungsi: disertakan dalam operator pengelompokan
Ungkapan fungsi bernama
Apabila bercakap tentang ungkapan fungsi yang dinamakan, sudah tentu ia mesti mempunyai nama Contoh var bar = function foo(){} ialah ungkapan fungsi bernama yang sah, tetapi ada satu perkara yang perlu diingat: nama ini hanya Sah dalam skop fungsi yang baru ditakrifkan, kerana spesifikasi menetapkan bahawa pengecam tidak boleh sah dalam skop sekeliling:
var f = function foo(){ return typeof foo; // foo是在内部作用域内有效 }; // foo在外部用于是不可见的 console.log(typeof foo); // "undefined" console.log(f()); // "function" var f = function foo(){ return foo; // foo是在内部作用域内有效 }; // foo在外部用于是不可见的 console.log(typeof foo); // "undefined" console.log( f()==f); // "function" console.log(f.name);//foo
Memandangkan ini diperlukan, apakah kegunaan ungkapan fungsi yang dinamakan? Kenapa nama?
Seperti yang kami katakan pada mulanya: memberinya nama boleh menjadikan proses penyahpepijatan lebih mudah, kerana apabila penyahpepijatan, jika setiap item dalam timbunan panggilan mempunyai nama sendiri untuk menerangkannya, maka proses penyahpepijatan akan menjadi hebat , perasaan itu berbeza.
ps: Perbezaan antara pengisytiharan fungsi dan ungkapan fungsi dalam JS
Pengisytiharan fungsi dalam Js merujuk kepada bentuk berikut:
function functionName(){ }
mengisytiharkan fungsi dengan cara ini, manakala ungkapan fungsi mengisytiharkan fungsi seperti ungkapan, seperti:
var functionName = function(){ }
Mungkin ramai rakan terkeliru apabila melihat kedua-dua kaedah penulisan ini adalah serupa dan kedua-duanya nampak boleh dilaksanakan. Jadi apa bezanya?
Sebenarnya, penghurai js tidak melayan pengisytiharan fungsi dan ungkapan fungsi secara sama rata. Untuk pengisytiharan fungsi, penghurai js akan membacanya terlebih dahulu untuk memastikan bahawa pengisytiharan telah dihuraikan sebelum semua kod dilaksanakan, seperti mentakrifkan pembolehubah jenis asas yang lain, hanya akan dihuraikan apabila ayat tertentu dilaksanakan amalan, mereka masih akan mempunyai perbezaan Khususnya, apabila menggunakan borang pengisytiharan fungsi untuk mentakrifkan fungsi, pernyataan panggilan boleh ditulis sebelum pengisytiharan fungsi, dan yang terakhir akan melaporkan ralat jika ia berbuat demikian.