我似乎无法理解JavaScript变量作用域的一个特定案例。与我发现的其他示例和问题不同,我对嵌套函数的作用域感兴趣。
我在这个JSFiddle上设置了一个示例。相关部分如下:
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
//1 and 2: direct reference
logMessage("a = " + a); // a = 1
//logMessage("b = " + b); // Error: b is not defined
//3 and 4: using this
logMessage("this.a = " + this.a); // this.a = undefined
logMessage("this.b = " + this.b); // this.b = undefined
//5 and 6: using self
logMessage("self.a = " + self.a); // self.a = undefined
logMessage("self.b = " + self.b); // self.b = 2
}
}
现在我理解直接引用 a
可以正常工作。
我也明白消息 3 和 4(this.a
和 this.b
)会失败,因为 this
指向内部函数。我还明白第 6 行能工作是因为我保存了对原始对象的引用。
我不明白的是:
- 为什么消息 1 和 2 的工作方式不同?
- 为什么消息 5 和 6 的工作方式不同?
var a = 5;
)与不是变量但是对象属性的东西进行比较(this.b = 10;
会将this
指向的对象的属性b
设置为10
)。这些事物并不相同,因此它们的行为也不相同。请注意区分。 - NikoinnerMethod.call(this);
或者this.method = innerMethod;
以及(new MyObject()).method();
,4会如何变化。 - Paul S.this
引用有点超出问题的范围,但是如果OP或任何人想阅读,这是一篇不错的文章:神话般的方法 作者是TJ Crowder。 - Fabrício Matté