Menyelidiki Sintaks Fungsi Tanpa Nama Terkapsul
Dalam JavaScript, fungsi tanpa nama terkapsul melibatkan melampirkan blok kod dalam kurungan dan melaksanakannya dengan segera . Sintaks ini mempunyai kepentingan dalam mencegah pencemaran skop global dan memudahkan skrip termodular. Walau bagaimanapun, timbul persoalan mengapa (function(){})(); berkelakuan jelas daripada function(){}();.
Pengisytiharan Fungsi lwn. Ungkapan Fungsi
Pembezaan sintaks bergantung pada sama ada fungsi dihuraikan sebagai Pengisytiharan Fungsi atau a FunctionExpression. Perbezaan penting terletak pada kehadiran atau ketiadaan pengecam nama, yang diwajibkan untuk Pengisytiharan Fungsi.
Pengisytiharan Fungsi mengikut peraturan tatabahasa "Pengecam fungsi (FormalParameterListopt) {FunctionBody}" memerlukan pengecam bernama.
Merangkum Tanpa Nama Functions
Sebaliknya, FunctionExpressions, dikawal oleh "function Identifieropt(FormalParameterListopt) {FunctionBody}", membenarkan penamaan pilihan. Ini membolehkan kami mencipta ungkapan fungsi yang tidak dinamakan dalam kurungan:
(function () { alert(2 + 2); }());
Peranan Operator Pengelompokan
Kurungan yang digunakan untuk merangkum fungsi tanpa nama memainkan peranan penting sebagai Operator Pengelompokan. Ia menandakan penilaian ekspresi, dan FunctionExpressions dinilai. Oleh itu, mengelilingi FunctionDeclaration dengan tanda kurungan memaksanya untuk dianggap sebagai FunctionExpression.
Pemahaman Kontekstual
Peraturan tatabahasa untuk FunctionDeclarations dan FunctionExpressions boleh membawa kepada kesamaran. Penghurai menyelesaikannya dengan mempertimbangkan konteks di mana fungsi itu muncul. FunctionDeclarations biasanya ditemui dalam skop global atau dalam badan fungsi, manakala FunctionExpressions boleh muncul dalam pelbagai konteks, termasuk dalam blok.
Potensi Perangkap
Semasa menggunakan fungsi dalam blok. boleh memberikan enkapsulasi, ia tidak digalakkan kerana tingkah laku yang tidak dapat diramalkan. Contohnya:
if (true) { function foo() { alert('true'); } } else { function foo() { alert('false!'); } } foo(); // Outputs "true" with ambiguous behavior
Atas ialah kandungan terperinci Mengapakah `(function(){})();` Berbeza daripada `function(){}();` dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!