0
// Situation 1 
var a = function A() { 
    this.x = 1;
    var b = function B () {
        this.x = 2;
        console.log('Method B : x = ' + this.x);
    };
    console.log('Method A : x = ' + this.x);
    b();
}

当我调用 a() 时,我的结果是

Method A : x = 1
Method B : x = 2

但是,如果我将“this.x = 2”删除为:

// Situation 2
var a = function A() { 
    this.x = 1;
    var b = function B () {
        console.log('Method B : x = ' + this.x);
    };
    console.log('Method A : x = ' + this.x);
    b();
}

我的结果将是

Method A : x = 1
Method B : x = 1

我不明白为什么

  • 在情况 2 中:函数 B 的“this”引用了函数 A 的“this”

  • 在情况 1 中:在函数 B 中分配“this.x = 2”时,函数 A 的“this.x”没有改变

我的代码在 Chrome v23 上运行

4

5 回答 5

2

由于,this.x = 2在函数 B 的定义中,它不会在 B 被调用之前发生,而不是在它被定义时发生。试试这个版本,看看:

// Situation 3
var a = function A() { 
    this.x = 1;
    var b = function B () {
        this.x = 2;
        console.log('Method B : x = ' + this.x);
    };
    console.log('Method A before B: x = ' + this.x);
    b();
    console.log('Method A after B: x = ' + this.x);
}
于 2012-12-22T02:56:33.613 回答
2
  1. 原因this.x是两者都发生了变化,a因为b它们都在引用该window对象。

  2. 我认为你对这个有误解;this.x 调用后正在更改b。如果我们反转调用,我们可以看到这一点:

    b(); // 2
    console.log('Method A : x = ' + this.x); // 2
    
于 2012-12-22T02:57:25.517 回答
1

像你一样调用b(),将导致this引用全局对象window在浏览器环境中)。

这解释了你的行为,你基本上是在写作window.x = 1;

于 2012-12-22T02:55:22.523 回答
1

b()直到打印了 A 的值之后,您才调用。因此 x 的值为 1,然后 b 将其更改为 2。

如果您b()在打印之前调用a(),输出将是

Method A : x = 2
Method B : x = 2

将首先b()更改值,然后a()将记录

这是功能

var a = function A() { 
this.x = 1;
var b = function B () {
    this.x = 2;
    console.log('Method B : x = ' + this.x);
};
b();
    console.log('Method A : x = ' + this.x);

}

a 和 b 都引用了 window 对象window.x

于 2012-12-22T02:59:09.783 回答
0

this是 javascript 中的一个特殊关键字,它取决于上下文。在您的情况下function B()是在function A(). 因此,如果您不覆盖它this.xfunction B()它将是您在 中分配的值function A()

于 2012-12-22T02:59:42.900 回答