&引用;这";函数调用中的javascript

&引用;这";函数调用中的javascript,javascript,function,this,Javascript,Function,This,当我调用a()时,我的结果是 // 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(); } 但如果我将“this.x=2”删除为

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

// 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();
}
但如果我将“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();
}
我不明白为什么

  • 在情况2中,函数B的“this”是指函数A的“this”
但是

  • 在情况1中,当在函数B中分配“this.x=2”时,函数A的“this.x”没有改变
我的代码在Chrome v23上运行

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

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

像您这样调用
b()
将导致
引用全局对象(
浏览器环境中的窗口


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

因为,
这个.x=2
在函数B的定义中,它在调用B之前不会发生,在定义B时不会发生。尝试此版本并查看:

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

因为,
this.x=2
在函数B的定义中,它在调用B之前不会发生,而在定义B时不会发生。尝试此版本并查看:

Method A : x = 1
Method B : x = 1
  • a
    b
    中更改
    this.x
    的原因是它们都引用了
    窗口
    对象

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

    // 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);
    }
    
  • a
    b
    中更改
    this.x
    的原因是它们都引用了
    窗口
    对象

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

    // 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);
    }
    
  • 直到打印了A的值之后,才调用
    b()
    。因此,x的值为1,然后b将其更改为2

    如果在打印
    a()
    之前调用
    b()

    b(); // 2
    console.log('Method A : x = ' + this.x); // 2
    
    As
    b()
    将首先更改值,然后
    a()
    将记录

    这就是函数

    Method A : x = 2
    Method B : x = 2
    
    ​a和b都引用窗口对象
    window.x

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

    如果在打印
    a()
    之前调用
    b()

    b(); // 2
    console.log('Method A : x = ' + this.x); // 2
    
    As
    b()
    将首先更改值,然后
    a()
    将记录

    这就是函数

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

    ​a和b都引用window对象
    window.x
    这是javascript中的一个特殊关键字,它取决于上下文。在您的例子中,
    函数B()
    位于
    函数A()的上下文中。因此,如果您不在
    函数B()
    中覆盖
    this.x
    ,它将是您在
    函数A()
    中指定的值,这是javascript中的一个特殊关键字,它取决于上下文。在您的例子中,
    函数B()
    位于
    函数A()的上下文中。因此,如果您不在函数B()中覆盖
    这个.x
    它将是您在
    函数A()中指定的值。然后函数A()中的“this”引用对象A,但我不明白为什么“this”引用全局对象?我认为当赋值“var A=函数A()”时,创建函数对象A()。然后函数A()中的“this”引用对象A,但我不明白为什么“this”引用全局对象?