2013-12-23 44 views
2

调用我有以下代码:此内部功能的当由呼叫

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 be call函数时,事情会变得有线。这==== obj,这是显而易见的,但为什么这个===窗口?

回答

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