【发布时间】:2013-02-23 23:23:21
【问题描述】:
我似乎无法理解 JavaScript 变量范围的特定情况。与我发现的其他示例和问题不同,我对嵌套函数的范围很感兴趣。
我在this 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 不一样?
【问题讨论】:
-
为什么它们的工作方式一样?似乎您是在用 Java 或其他某种语言进行类比,其中
this命名空间是隐式的,而 JS 并非如此。 -
@FabrícioMatté 我这样做可能是无意识的(双关语)。我不明白范围界定是否应该使变量/成员自动暴露给内部成员。好像不是这样,因为不一致。
-
@Alpha 您将变量 (
var a = 5;) 与不是变量而是对象属性的事物进行比较(this.b = 10;设置this所指对象的属性b10)。这些东西不一样,因此行为也不相同。 -
我在想一个简单的方法来解释它,但基本上 JS 的词法范围不会像你说的那样自动将成员暴露给内部成员。
-
@Alpha 看看如果你做了
innerMethod.call(this);或this.method = innerMethod;和(new MyObject()).method();,4 会发生什么变化
标签: javascript scope scoping