Rumah > Soal Jawab > teks badan
Dalam kod di bawah, adakah konteks pelaksanaan baharu dicipta untuk setiap item dalam tatasusunan atau adakah konteks pelaksanaan kekal sama dan hanya rekod persekitaran persekitaran leksikal dikemas kini?
Kod tidak menimbulkan ralat, jadi saya menganggap skop baharu (persekitaran leksikal) dicipta secara bebas daripada konteks pelaksanaan, tetapi saya tidak pasti sama ada saya betul.
const nums = [1, 2, 3] nums.forEach(num => { const foo = num })
P粉6748763852024-04-02 23:22:53
Tiada apa-apa yang istimewa tentang panggilan balik yang diberikan kepada fungsi perpustakaan standard. Ia masih berfungsi dan masih dipanggil dengan cara biasa memanggil fungsi.
Ya. Setiap kali anda memanggil fungsi (dalam kes ini, apabila forEach
memanggil panggilan baliknya), konteks pelaksanaan baharu dicipta.
(dalam kes ini) tidak berasingan daripada mencipta konteks pelaksanaan baharu, tidak. Sebagai sebahagian daripada prosedur standard untuk memanggil fungsi.
Sebaliknya, pertimbangkan gelung for-of
:
for (const num of nums) { const foo = num }
Tiada fungsi panggil balik untuk memanggil di sini; badan gelung hanyalah satu blok. Walau bagaimanapun, disebabkan cara semantik skop blok ditakrifkan, objek persekitaran leksikal baharu dicipta untuk setiap lelaran gelung. Ini bermakna, sama seperti forEach
回调类似,每次循环迭代都有一个新的 foo
,即使不需要函数调用。 (如果您要在该块内创建事件处理程序或类似的事件处理程序,这非常方便。)(如果我们使用 var
代替,则不会每次都有一个新的,var
会跳出该块到周围函数作用域或全局作用域,因为 var
不是块作用域。这是我建议永远不要在新代码中使用 var
panggil balik, terdapat foo
baharu untuk setiap lelaran gelung, walaupun jika tiada panggilan fungsi diperlukan. (Ini sangat mudah jika anda ingin mencipta pengendali acara atau pengendali acara serupa di dalam blok.) (Jika kami menggunakan var
sebaliknya, kami tidak akan mempunyai yang baharu setiap kali, < code>var akan melompat keluar dari blok ke skop fungsi sekitar atau skop global, kerana var
bukan skop blok Ini adalah syor saya untuk tidak menggunakan var dalam kod baharu > salah satu sebabnya.