关于javascript中的clousure的访谈测试?

时间:2017-06-26 14:44:24

标签: javascript closures

这是一个面试问题!我无法知道它的原因!



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);




2 个答案:

答案 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());

这意味着函数返回的是全局对象,变量xy都是对全局对象的引用。在它返回之前,它会将属性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());