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 })
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
: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, terdapatfoo
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 menggunakanvar
sebaliknya, kami tidak akan mempunyai yang baharu setiap kali, var akan melompat keluar dari blok ke skop fungsi sekitar atau skop global, keranavar
bukan skop blok Ini adalah syor saya untuk tidak menggunakanvar dalam kod baharu > salah satu sebabnya.