我已经阅读了几篇关于执行上下文的更全面的文章,现在我有点困惑和头脑混乱。
为了使问题尽可能简短,避免长时间引用,我最好尝试通过一个专注于我无法获得的细节的示例来说明我的心理模型,以便您可以纠正我并指出错误。
下面是一个例子:
var tomato = 'global tomato';
{
let tomato = 'block tomato';
console.log(tomato); // 'block tomato'
}
console.log(tomato); // 'global tomato'
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都清楚了。当 JS 引擎创建一个执行上下文(在我们的例子中是全局的)var tomato时,第一行的声明被放置到一个块范围内的Variable Environmentwhile 中let tomato,进入了一个Lexical Environment. 这解释了我们如何最终得到 2 个不同的西红柿。
现在,让我们添加另一个番茄,如下所示:
var tomato = 'global tomato';
{
let tomato = 'block tomato';
{
console.log(tomato); // ReferenceError: Cannot access 'tomato' before initialization
let tomato = 'nested block tomato';
}
console.log(tomato); // won't reach here
}
console.log(tomato); // won't reach …Run Code Online (Sandbox Code Playgroud)