Adakah Penutupan Ungkapan dan Panggilan Fungsi Sama dalam JavaScript?
Dalam JavaScript, coretan kod berikut kelihatan menghasilkan output yang sama:
<code class="js">(function() { bar = 'bar'; alert('foo'); })(); (function() { bar = 'bar'; alert('foo'); }());</code>
Kedua-dua blok melaksanakan pernyataan amaran('foo') dan mengisytiharkan bar pembolehubah boleh diakses di luar penutupan. Satu-satunya perbezaan yang ketara terletak pada sintaks penutupan, menggunakan )()} berbanding }());.
Adakah binaan ini setara dengan fungsinya?
Jawapan : Ya, mereka adalah sama.
Pertimbangan Tambahan:
Jika kurungan tambahan diperkenalkan, tingkah laku berubah. Pertimbangkan senario berikut:
Senario 1:
<code class="js">new (function() { this.prop = 4; })().prop;</code>
Ungkapan ini mencipta tika baharu kelas fungsi dan mengakses sifat prop bagi tika baharu, mengembalikan nilai 4. Ia bersamaan dengan:
<code class="js">function MyClass() { this.prop = 4; } new MyClass().prop;</code>
Senario 2:
<code class="js">new ( function() { return { Class: function() { } }; }() ).Class;</code>
Dalam kes ini, ungkapan baharu menunjukkan sifat Kelas bagi fungsi nilai pulangan. Tanda kurung di sekeliling panggilan fungsi adalah penting, menunjukkan bahawa fungsi itu harus digunakan dengan segera.
Ini bersamaan dengan:
<code class="js">var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; // Or, new namespace.Class;</code>
Jika tanda kurung dialih keluar daripada panggilan untuk getNamespace() , ungkapan itu akan menjadikan kelas getNamespace dan mengakses sifat Kelas bagi tika baharu.
Atas ialah kandungan terperinci Adakah Tanda Kurung dalam Panggilan dan Penutupan Fungsi JavaScript Sentiasa Hanya Gula Sintaktik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!