我有以下代码:
var outer = function(){
var that = this;
function inner(){
assert(this===that, "Inner === Outer");
console.log(this);
console.log(that);
}
inner();
return this;
};
outer();
var obj = {};
outer.call(obj);
执行第一次调用时 - outer()。对我来说一切都很清楚 - 外部在窗口上下文中调用,这个和那个===窗口。然后当我调用函数外部调用函数时,事情变得有线。那个=== obj,很明显,但为什么这个===窗口?
答案 0 :(得分:5)
因为您通过引入闭包来丢失上下文。 this
仅取决于您如何调用该功能。它可以是隐式的,就像对象方法的情况一样。在您的代码inner
中没有使用任何上下文调用,因此它默认为window
。你可以这样做:
var outer = function(){
var that = this;
function inner(){
assert(this===that, "Inner === Outer");
console.log(this);
console.log(that);
}
inner.call(this); // explicit context
return this;
};