Почему этот немедленно вызванный метод возвращает объект окна?

Почему сразу вызванный метод возвращает window объект как this,

var o = {};  
o.foo = function () {  
    console.log(this);  
}(); //Window {…}

но при выполнении позже метод возвращает объект o (как я бы ожидал в обоих случаях)?

var o = {};
o.foo = function () {
    console.log(this);
}
o.foo(); //Object {foo: function}

4 ответа

Решение

"это" определяется во время вызова. Присвоение переменной происходит справа налево, поэтому функция вызывается до того, как было выполнено какое-либо присваивание, и, следовательно, "this" по-прежнему относится к объекту глобального окна.

var o = {};  
o.foo = function () {  
    console.log(this);  
}(); //

Это глобальный контекст, поэтому вы видите объект окна. Чтобы показать это o объект, который вам нужно привязать к o объект. this ссылается на объект в текущем контексте. значение this всегда держит window объект, когда он не находится ни в каком другом контексте.

o.foo = function () {  
    console.log(this);  
}.bind(o); //

Демо: http://jsfiddle.net/X6cyr/1/

Когда вы выполняете выражение немедленно вызванной функции (IIFE):

... = (function () {  
         console.log(this);
      }());

значение этого не устанавливается вызовом, поэтому при входе в функцию оно не определено, поэтому устанавливается в глобальный объект. В строгом режиме он останется неопределенным.

Если вы выполните console.log(this) в теле определения объекта, по умолчанию это будет ссылаться на объект Window, потому что ваш объект не существует в браузере. поэтому вы должны выполнить функцию после определения объекта, вот моя демонстрационная версия http://jsfiddle.net/X6cyr/2/

Другие вопросы по тегам