Javascript 当通过调用调用时,这是内部函数的一部分

Javascript 当通过调用调用时,这是内部函数的一部分,javascript,Javascript,我有以下代码: 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

我有以下代码:

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()。对我来说一切都很清楚-外部在窗口上下文中被调用,并且这个和那个===窗口。然后,当我调用函数outer be call function时,事情就联系起来了。那===obj,这很明显,但为什么会出现这个===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;
};