Почему этот немедленно вызванный метод возвращает объект окна?
Почему сразу вызванный метод возвращает 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); //
Когда вы выполняете выражение немедленно вызванной функции (IIFE):
... = (function () {
console.log(this);
}());
значение этого не устанавливается вызовом, поэтому при входе в функцию оно не определено, поэтому устанавливается в глобальный объект. В строгом режиме он останется неопределенным.
Если вы выполните console.log(this)
в теле определения объекта, по умолчанию это будет ссылаться на объект Window, потому что ваш объект не существует в браузере. поэтому вы должны выполнить функцию после определения объекта, вот моя демонстрационная версия http://jsfiddle.net/X6cyr/2/