我读了很多关于javascript范围链的文章,我认为我对它有一个很好的理解。然而,一个非常简单的练习让我意识到我根本不理解它。
我创建了以下代码。
function foo () {
var b = 2;
bar()
}
function bar () {
console.log(b);
}
foo();
此代码给出了引用错误。但是,我认为它仍会打印出来2.我的推理如下:
我的理由是基于我理解函数X的[[Scope]]内部属性被设置为执行函数X时运行的执行上下文。不基于声明函数X的位置。
答案 0 :(得分:3)
b
在 foo
的范围内定义。
bar
的范围调用 foo
,是的,但它是在foo
范围之外定义的。这意味着bar
无法访问b
。
因为图像通常可以提供帮助:
将每个红色方块视为“范围”。 foo
和bar
共享外部范围,但它们无法访问彼此的内部范围。
答案 1 :(得分:1)
让我以不同的方式编写代码,以考虑范围。
var scope = {};
scope.foo = function() {
var b = 2;
scope.bar()
}
scope.bar = function() {
// this will look for a property 'b' defined in the bar method, but it doesn's exist
console.log(b);
// changing the console.log call to match the changes made above, means it will
// look like this
console.log(scope.b)
// but now scope.b is also not defined
}
scope.foo();
换句话说,当您尝试访问“bar”中的“b”时,它将在创建“bar”的范围内搜索它,而不是在调用“bar”的范围内搜索它。