首页  >  问答  >  正文

javascript forEach 是否为每个数组项创建一个新的执行上下文,或者只是更新当前执行上下文的词法环境?

在下面的代码中,是为数组中的每个项目创建一个新的执行上下文,还是执行上下文保持不变,只是词法环境的环境记录更新?

代码不会引发错误,因此我假设新的作用域(词法环境)是独立于执行上下文创建的,但我不确定我的说法是否正确。

const nums = [1, 2, 3]

nums.forEach(num => {
  const foo = num
})

P粉663883862P粉663883862183 天前312

全部回复(1)我来回复

  • P粉674876385

    P粉6748763852024-04-02 23:22:53

    提供给标准库函数的回调没有什么特别的。它们仍然是函数,并且仍然以调用函数的通常方式进行调用。

    是的。每当您调用函数时(在本例中,当 forEach 调用其回调时),都会创建一个新的执行上下文。

    (在本例中)不是与创建新的执行上下文分开的,不是。作为调用函数的标准过程的一部分。

    相比之下,考虑一个 for-of 循环:

    for (const num of nums) {
        const foo = num
    }

    这里没有回调函数可以调用;循环体只是一个块。但是,由于块作用域语义的定义方式,会为每次循环迭代创建一个新的词法环境对象。这意味着,与 forEach 回调类似,每次循环迭代都有一个新的 foo,即使不需要函数调用。 (如果您要在该块内创建事件处理程序或类似的事件处理程序,这非常方便。)(如果我们使用 var 代替,则不会每次都有一个新的,var 会跳出该块到周围函数作用域或全局作用域,因为 var 不是块作用域。这是我建议永远不要在新代码中使用 var 的原因之一。)

    回复
    0
  • 取消回复