我阅读了许多关于 javascript 作用域链的文章,我认为我对它有一个不错的理解。然而,一个非常简单的练习让我意识到我根本不理解它。
我创建了以下代码。
function foo () {
var b = 2;
bar()
}
function bar () {
console.log(b);
}
foo();
此代码给出了参考错误。但是,我认为它仍然会打印出 2。我的理由如下:
- foo 和 bar 的函数声明。
- Foo 被执行,这会创建一个新的执行上下文。Foo 的内部属性 [[Scope] 设置为全局。
- var b 被提升。
- var b 被赋值为 2。
- bar 在 foo 执行上下文中执行。因此,我假设 bar 函数的内部属性 [[Scope]] 将设置为 foo。
- b 未在函数 bar 中定义,因此查找范围链并找到值 b = 2。
- 控制台.log(2);
我的推理是基于我理解函数 X 的 [[Scope]] 内部属性设置为在函数 X 执行时正在运行的执行上下文。不基于函数 X 的声明位置。