2
var x = 9;
var mod = {
    x: 81,
    assign: function(){
        this.x = 9;
        x = 3;
    },
    checkVars: function(){
        alert(x + " - " + this.x );
    }
};

mod.checkVars(); //9 - 81

mod.assign();
mod.checkVars(); //3 - 9

alert(x); //3

请解释作用域链是如何在这里设置的。为什么xincheckVarsassignskip 对象的范围解析mod

4

2 回答 2

5

我在您的程序中添加了一些评论:

var x = 9; // This is the *only* variable called x in your program
var mod = {
    x: 81, // this x refers to a property of mod also called x
    assign: function(){
        this.x = 9; // "this" refers to the object mod, this.x is the x property of mod
        x = 3; // x here refers to your variable called x
    },
    checkVars: function(){
        alert(x + " - " + this.x ); // same as above
    }
};

mod.checkVars(); //9 - 81

mod.assign();
mod.checkVars(); //3 - 9

alert(x); //3

换句话说,您的困惑与范围解析没有任何关系。每当您引用x时,您指的是x在程序顶部定义的唯一一个名为您的变量。每当您引用 时this.x,您指的是在对象文字x上定义的名为您的属性。mod

希望这有助于澄清事情!

于 2013-06-21T17:32:25.567 回答
1

变量和对象属性不是一回事。变量是作用域链的一部分,属性不是。assign和范围内的唯一变量checkVarsxmod。的属性mod只能通过this.propName(或mod.propName)在这些方法中可见。

于 2013-06-21T17:36:45.703 回答