JavaScript本地范围:var vs. this

Alp*_*pha 9 javascript scope scoping

我似乎无法理解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
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我明白了a直接作用的参考.我也理解消息3和4(this.athis.b)将失败,因为它this引用了内部函数.我也明白第6行是有效的,因为我保存了对原始对象的引用.

我不明白的是:

  • 消息1和2为什么不一样?
  • 为什么第5和第6条消息不一样?

the*_*orn 4

变量a就是变量。innerMethod它在(这只是一个嵌套函数)的作用域中可见,as a,这就是它的声明方式(即JavaScript具有词法作用域规则,内部函数可以看到它们在其中定义的函数的变量)。

this与构造函数的本地范围不同MyObject

您已经看到这是ofself的别名,并且已在其自己的范围内覆盖。不过,由于不是函数作用域的别名,因此也不会在这里工作。thisMyObjectinnerMethodthisthisself.athis.a

要获得词法作用域更严格的解释,您可以从维基百科开始:http://en.wikipedia.org/wiki/Scope_(computer_science)

您可以阅读 ECMA 标准中的执行上下文和标识符解析规则http://es5.github.com/#x10.3