В моем предыдущем посте мы рассмотрели this
Сегодня мы рассмотрим несколько ситуаций, в которых this
1. Забыть «новое»
Рассмотрим следующий код:
window.WhoAmI = "I'm the window object";
function Test() {
this.WhoAmI = "I'm the Test object";
}
var t = Test();
alert(window.WhoAmI); // I'm the Test object
alert(t.WhoAmI); // t is undefined
Что мы действительно имели в виду:
var t = new Test();
Пропуск new
Другие языки выдают ошибку, когда сталкиваются с прямым вызовом конструктора, но JavaScript просто воспринимает это как любой другой вызов функции. this
Test()
t
undefined
Эту ситуацию можно исправить, если вы пишете библиотеку JavaScript для сторонних разработчиков. См. Исправление экземпляров объектов в JavaScript .
2. Модуль безумия
Этот даст вам головную боль. Изучите следующий код, который использует шаблон модуля:
window.WhoAmI = "I'm the window object";
var Module = function() {
this.WhoAmI = "I'm the Module object";
function Test() {
this.WhoAmI = "I'm still the Module object";
}
return {
WhoAmI: WhoAmI,
Test: Test
};
}();
alert(Module.WhoAmI); // I'm the Module object
alert(window.WhoAmI); // I'm the Module object
Module.Test();
alert(Module.WhoAmI); // I'm still the Module object
Код выглядит логичным — так почему же window.WhoAmI
Нам нужно помнить, что у нас есть самореализуемая функция. Его результаты возвращаются в переменную Module
следовательно, это глобальный объект окна. Другими словами, this
this.WhoAmI
window.WhoAmI
Функция возвращает объект JavaScript со свойством "I'm the Module object"
WhoAmI
Но к чему это относится? В этом случае интерпретатор JavaScript 'WhoAmI'
window.WhoAmI
"I'm the Module object"
Наконец, мы запускаем метод Test()
Тем не менее, Module
Test
this
Module
WhoAmI
Таким образом, избегайте использования this
Тебе это никогда не нужно.
3. Метод заблуждений
Вот еще один шаблон JavaScript, который будет связан с вашими синапсами:
var myObject = {};
myObject.method = function() {
this.WhoAmI = "I'm myObject.method";
function Test() {
this.WhoAmI = "I'm myObject.method.Test()";
}
Test();
return this.WhoAmI;
};
alert(myObject.method()); // I'm myObject.method
В этом примере Test()
myObject.method()
На первый взгляд, вы ожидаете, что this
Test()
myObject
Это не так: это относится к глобальному объекту окна, так как это просто другая функция.
Если вы хотите сослаться на myObject
var myObject = {};
myObject.method = function() {
this.WhoAmI = "I'm myObject.method";
var T = this;
function Test() {
T.WhoAmI = "I'm myObject.method.Test()";
}
Test();
return this.WhoAmI;
};
alert(myObject.method()); // I'm myObject.method.Test()
4. Методы ссылок
Вот небольшой код, который, к счастью, будет работать именно так, как вы ожидаете:
var myObject = {};
myObject.WhoAmI = "I'm myObject";
myObject.method = function() {
this.WhoAmI = "I'm myObject.method";
};
// examine properties
alert(myObject.WhoAmI); // I'm myObject
myObject.method();
alert(myObject.WhoAmI); // I'm myObject.method
Давайте сделаем небольшое изменение и назначим myObject.method
// examine properties
alert(myObject.WhoAmI); // I'm myObject
var test = myObject.method;
test();
alert(myObject.WhoAmI); // I'm myObject
Почему myObject.WhoAmI
В этом случае вызов test()
this
myObject
Если вы думаете, что это противно, подождите, пока мы не взглянем на обработчики событий JavaScript в моем следующем посте!
Если вы хотите узнать больше от Крейга, подпишитесь на нашу еженедельную новостную рассылку Tech Times .