通过调用调用时的内部函数

Adr*_*ran 2 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(obj);
Run Code Online (Sandbox Code Playgroud)

执行第一次调用时 - outer().对我来说一切都很清楚 - 外部在窗口上下文中调用,这个和那个===窗口.然后当我调用函数外部调用函数时,事情变得有线.那个=== obj,很明显,但为什么这个===窗口?

elc*_*nrs 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;
};
Run Code Online (Sandbox Code Playgroud)