2014-09-13 2 views
0

В следующем коде,Почему функция IIFE/function не допускает «это» во внешней функции?

var myObject = { 
    foo: "bar", 
    func: function() { 
     var self = this; 
     console.log("outer func: this.foo = " + this.foo); 
     console.log("outer func: self.foo = " + self.foo); 
     (function() { 
      console.log("inner func: this.foo = " + this.foo); 
      console.log("inner func: self.foo = " + self.foo); 
     }()); 
    } 
}; 
myObject.func(); 

Он печатает это в консоли:

outer func: this.foo = bar 
outer func: self.foo = bar 
inner func: this.foo = undefined 
inner func: self.foo = bar 

Первые два довольно очевидны, но я не понимаю, для третьего и четвертого, почему IIFE имеет доступ к себе, но не имеет доступа для этого? Я думал, что он создает закрытие, поэтому он имеет доступ к внешним переменным «я» и тому подобное?

+0

вы можете использовать».call (это) "вместо"() "с аноном, но _this_ не наследуется, как закрытие. – dandavis

+5

Поскольку выражение 'this' является выражением, которое вычисляет * текущий контекст функции *. Это * не * переменная, и она * не * унаследована от сдерживаемой области. – user2864740

+0

Это просто непонимание того, как это работает. См. Здесь http://stackoverflow.com/questions/3127429/javascript-this-keyword – elclanrs

ответ

0

Я не уверен, что это решит вашу проблему, но вы можете связать this, передав его в качестве аргумента в IIFE:

(function(context) { 
    console.log("inner func: context.foo = " + context.foo); 
    console.log("inner func: self.foo = " + self.foo); 
}(this)); 

Fiddle

+1

Могу также использовать 'call/apply'. На самом деле нет никакого преимущества для этого над' self', в этом случае IMOHO. – user2864740

+0

Вам лучше было бы использовать #bind вместо этого, который переназначает переменную 'this'. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind – Mark

Смежные вопросы