2013-12-23 48 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; 
};