Быстрый совет по передовым методам, прежде чем я буду болтать о волшебной этой переменной. Если вы хотите объектно-ориентированное программирование (ООП) в Javascript, которое близко отражает более традиционные / классические шаблоны наследования, выберите фреймворк, изучите его причуды и не пытайтесь стать умными. Если вы хотите стать умным, изучите javascript как функциональный язык и избегайте думать о таких вещах, как классы.
Что поднимает одну из самых важных вещей, о которых нужно помнить о Javascript, и повторять для себя, когда это не имеет смысла. Javascript не имеет классов. Если что-то похоже на класс, это умный трюк. Javascript имеет объектов (без кавычек не требуется) и функций . (это не на 100% точно, функции - это просто объекты, но иногда полезно думать о них как об отдельных вещах)
Переменная this присоединена к функциям. Всякий раз, когда вы вызываете функцию, этому присваивается определенное значение, в зависимости от того, как вы вызываете функцию. Это часто называют шаблоном вызова.
Существует четыре способа вызова функций в javascript. Вы можете вызвать функцию как метод , как функция , как конструктор и с помощью apply .
как метод
Метод - это функция, которая прикреплена к объекту
var foo = {};
foo.someMethod = function(){
alert(this);
}
При вызове в качестве метода это будет связано с объектом, частью которого является функция / метод. В этом примере это будет связано с foo.
как функция
Если у вас есть отдельная функция, переменная this будет привязана к «глобальному» объекту, почти всегда объекту window в контексте браузера.
var foo = function(){
alert(this);
}
foo();
Это может быть тем, что сбивает вас с толку , но не расстраивайтесь. Многие считают это плохим дизайнерским решением. Поскольку обратный вызов вызывается как функция, а не как метод, поэтому вы видите то, что выглядит как непоследовательное поведение.
Многие люди справляются с этой проблемой, делая что-то вроде этого
var foo = {};
foo.someMethod = function (){
var that=this;
function bar(){
alert(that);
}
}
Вы определяете переменную , которая , которая указывает на this . Закрытие (тема, которой он владеет) сохраняет that
, поэтому, если вы вызываете bar в качестве обратного вызова, оно все равно имеет ссылку.
как конструктор
Вы также можете вызвать функцию в качестве конструктора. Исходя из соглашения об именах, которое вы используете (TestObject
), это также может быть тем, что вы делаете, и тем, что вас сбивает с толку .
Вы вызываете функцию как конструктор с ключевым словом new
.
function Foo(){
this.confusing = 'hell yeah';
}
var myObject = new Foo();
При вызове в качестве конструктора будет создан новый Объект, и этот будет привязан к этому объекту. Опять же, если у вас есть внутренние функции и они используются в качестве обратных вызовов, вы будете вызывать их как функции, и this будет привязано к глобальному объекту. Используйте этот var that = this;
трюк / шаблон.
Некоторые люди думают, что ключевое слово constructor / new - это кость, брошенная Java / традиционным программистам ООП как способ создания чего-то похожего на классы.
Методом применения.
Наконец, у каждой функции есть метод (да, функции - это объекты в Javascript) с именем apply
. Применить позволяет вам определить значение this , а также позволяет передать массив аргументов. Вот бесполезный пример.
function foo(a,b){
alert(a);
alert(b);
alert(this);
}
var args = ['ah','be'];
foo.apply('omg',args);