Это значение в анонимной функции 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();
Ответы
Ответ 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
.