这是一个面试问题!我无法知道它的原因!
function fun(val) {
this.x = val;
return this;
}
var x = fun(1);
var y = fun(2);
console.log(x.x); //I can't understand this result.
console.log(y.x);

答案 0 :(得分:1)
嗯,我认为这是因为"这" fun函数中指的是Window对象,而不是函数内部的本地事物。因此你首先通过fun(1)调用它并使window.x = 1,然后通过fun(2)调用它,它变成window.x = 2 ..然后你控制台在x和y都是时记录它对窗口的引用...因此两者将具有相同的最终值。
答案 1 :(得分:0)
当您以“正常”方式调用函数时,this
对象指向全局对象(window
):
function testFunction () {
return this;
}
console.log(window === testFunction());
这意味着函数返回的是全局对象,变量x
和y
都是对全局对象的引用。在它返回之前,它会将属性x
分配给全局对象。
在第一个函数调用中,它将1
分配给全局对象的属性x
。在第二个函数调用中,它将2
分配给相同的属性。这就是你得到2
两次的原因。
如果您希望this
引用另一个对象而不是全局对象,则必须使用call
:
function testFunction (value) {
this.x = value;
return this;
}
var firstObject = {};
var secondObject = {};
var x = testFunction.call(firstObject, 1);
var y = testFunction.call(secondObject, 2);
console.log(x.x);
console.log(y.x);
console.log(x === firstObject);
console.log(y === secondObject);
console.log(window === testFunction());