Wird im folgenden Code für jedes Element im Array ein neuer Ausführungskontext erstellt, oder bleibt der Ausführungskontext derselbe und nur der Umgebungsdatensatz der lexikalischen Umgebung wird aktualisiert?
Der Code gibt keinen Fehler aus, daher gehe ich davon aus, dass der neue Bereich (lexikalische Umgebung) unabhängig vom Ausführungskontext erstellt wird, bin mir aber nicht sicher, ob ich richtig liege.
const nums = [1, 2, 3] nums.forEach(num => { const foo = num })
提供给标准库函数的回调没有什么特别的。它们仍然是函数,并且仍然以调用函数的通常方式进行调用。
是的。每当您调用函数时(在本例中,当
forEach
调用其回调时),都会创建一个新的执行上下文。(在本例中)不是与创建新的执行上下文分开的,不是。作为调用函数的标准过程的一部分。
相比之下,考虑一个
for-of
循环:这里没有回调函数可以调用;循环体只是一个块。但是,由于块作用域语义的定义方式,会为每次循环迭代创建一个新的词法环境对象。这意味着,与
forEach
回调类似,每次循环迭代都有一个新的foo
,即使不需要函数调用。 (如果您要在该块内创建事件处理程序或类似的事件处理程序,这非常方便。)(如果我们使用var
代替,则不会每次都有一个新的,var
会跳出该块到周围函数作用域或全局作用域,因为var
不是块作用域。这是我建议永远不要在新代码中使用var
的原因之一。)