函数调用javascript中的“this”

时间:2012-12-22 02:50:44

标签: javascript function this

// 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();
}

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

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上运行

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

  1. this.xab的更改原因是因为它们都引用了window对象。

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

    b(); // 2
    console.log('Method A : x = ' + this.x); // 2
    

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

在打印完A的值之前,您没有致电b()。因此,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.x

答案 4 :(得分:0)

this是javascript中的特殊关键字,它取决于上下文。在您的情况下,function B()位于function A()的上下文中。因此,如果您不覆盖this.x中的function B(),则它将是您在function A()中指定的值。