我似乎无法理解 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 的效果不一样?
最佳答案
a
变量就是一个变量。它在 innerMethod
(这只是一个嵌套函数)的范围内可见,作为 a
,这就是它的声明方式(即 JavaScript 具有词法范围规则,内部函数可以看到它们在其中定义的函数的变量)。
this
与 MyObject
构造函数的局部作用域不同。
你已经看到 self
是 MyObject
的 this
的别名,并且 innerMethod
已经被覆盖this
在它自己的范围内。不过,由于 this
不是函数范围的别名,因此 self.a
和 this.a
都不会在这里工作。
对于词法作用域的更严格的解释,您可以例如从维基百科开始:http://en.wikipedia.org/wiki/Scope_(computer_science)
您可以阅读 ECMA 标准中的执行上下文和标识符解析规则 http://es5.github.com/#x10.3
关于JavaScript 本地作用域 : var vs. this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15046910/