2013-12-23 8 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); 

Когда первый вызов выполняются - внешний(). Для меня все ясно - внешняя называется в контексте окна и как это, так и это === окно. Тогда вещи становятся проводными, когда я вызываю функцию external be call function. Это === 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; 
}; 
Смежные вопросы