在下面的代码中,是为数组中的每个项目创建一个新的执行上下文,还是执行上下文保持不变,只是词法环境的环境记录更新?
代码不会引发错误,因此我假设新的作用域(词法环境)是独立于执行上下文创建的,但我不确定我的说法是否正确。
const nums = [1, 2, 3] nums.forEach(num => { const foo = num })
P粉6748763852024-04-02 23:22:53
提供给标准库函数的回调没有什么特别的。它们仍然是函数,并且仍然以调用函数的通常方式进行调用。
是的。每当您调用函数时(在本例中,当 forEach
调用其回调时),都会创建一个新的执行上下文。
(在本例中)不是与创建新的执行上下文分开的,不是。作为调用函数的标准过程的一部分。
相比之下,考虑一个 for-of
循环:
for (const num of nums) { const foo = num }
这里没有回调函数可以调用;循环体只是一个块。但是,由于块作用域语义的定义方式,会为每次循环迭代创建一个新的词法环境对象。这意味着,与 forEach
回调类似,每次循环迭代都有一个新的 foo
,即使不需要函数调用。 (如果您要在该块内创建事件处理程序或类似的事件处理程序,这非常方便。)(如果我们使用 var
代替,则不会每次都有一个新的,var
会跳出该块到周围函数作用域或全局作用域,因为 var
不是块作用域。这是我建议永远不要在新代码中使用 var
的原因之一。)