Подтвердить что ты не робот

Это значение в анонимной функции JavaScript

Может ли кто-нибудь объяснить мне, почему A истинно, а B - false? Я бы ожидал, что B тоже будет прав.

function MyObject() {

};

MyObject.prototype.test = function () {
    console.log("A", this instanceof MyObject);
    (function () {
        console.log("B", this instanceof MyObject);
    }());
}

new MyObject().test();
4b9b3361

Ответ 1

this является особенным. Он ссылается на объект, который функция вызывается от имени (чаще всего через точечный синтаксис).

Итак, в случае A функция вызывается от имени нового объекта MyObject. B находится в другой функции, которая явно не вызывается от имени какого-либо объекта, поэтому this по умолчанию используется глобальный объект (window).

Другими словами, this изменяется в зависимости от того, как вызывается функция, а не где и как она определена. Тот факт, что вы используете анонимную функцию (определенную внутри другой функции), является совпадением и не влияет на значение this.

Ответ 2

Внутри вашей анонимной функции this - глобальный объект.

Внутри test это экземпляр MyObject, на котором был вызван метод.


Всякий раз, когда вы вызываете такую ​​функцию:

somceFunction(); // called function invocation

this всегда глобальный объект или undefined в строгом режиме (если someFunction не был создан с bind ** - см. ниже)

Всякий раз, когда вы вызываете такую ​​функцию,

foo.someMethod();  //called method invocation

this установлено значение foo


** EcmaScript5 определяет функцию bind, которая позволяет вам создать функцию с предварительно установленным значением для this

Итак, это

    var obj = { a: 12 };
    var someFunction = (function () { alert(this.a); }).bind(obj);
    someFunction();

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

someFunction();

всегда имеет this, равный глобальному объекту (или undefined в строгом режиме)

Ответ 3

В анонимной функции this привязан к глобальному объекту (window в среде браузера).

Существуют различные способы доступа к экземпляру:

var self = this;
(function () {
    console.log("B", self instanceof MyObject);
}());

или

(function () {
    console.log("B", this instanceof MyObject);
}).call(this);

Ответ 4

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

Вы можете написать (function() { ... }).call(this), чтобы явно вызвать его с помощью this.