// 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
我不明白为什么
但是
我的代码在Chrome v23上运行
答案 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)
this.x
和a
中b
的更改原因是因为它们都引用了window
对象。
我认为你对这个有误解;调用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()
中指定的值。