javascript forEach 是否为每个数组项创建一个新的执行上下文,或者只是更新当前执行上下文的词法环境?
P粉663883862
P粉663883862 2024-04-02 00:13:25
0
1
305

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

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

const nums = [1, 2, 3]

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

P粉663883862
P粉663883862

全部回复(1)
P粉674876385

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

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

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

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!