cari

Rumah  >  Soal Jawab  >  teks badan

Adakah javascript forEach mencipta konteks pelaksanaan baharu untuk setiap item tatasusunan, atau adakah ia hanya mengemas kini persekitaran leksikal konteks pelaksanaan semasa?

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粉663883862P粉663883862231 hari yang lalu411

membalas semua(1)saya akan balas

  • P粉674876385

    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.

    balas
    0
  • Batalbalas