В файле JavaScript я увидел:
function Somefunction(){
var that = this;
...
}
Какова цель объявления that
и назначения this
этого ему?
javascript
this
Крис
источник
источник
Ответы:
Я собираюсь начать этот ответ с иллюстрации:
Мой ответ первоначально продемонстрировал это с помощью jQuery, который немного отличается:
Поскольку
this
часто изменяется при изменении области действия путем вызова новой функции, вы не можете получить доступ к исходному значению с помощью его. Псевдоним этоthat
позволяет вам по-прежнему получить доступ к первоначальному значениюthis
.Лично мне не нравится использование в
that
качестве псевдонима. Редко очевидно, к чему это относится, особенно если функции длиннее пары строк. Я всегда использую более описательный псевдоним. В моих примерах выше я бы, наверное, использовалclickedEl
.источник
var self = this;
. Слово,that
кажется, подразумевает, что переменная является чем угодно, НОthis
.forEach
Функция принимает второй необязательный аргумент , который является связывание функции.colours.forEach(function(){/* 'this' is bound correctly --> */}, this);
Поэтому следует добавить примечание,var that = this
которое на самом деле не нужноforEach
.Из Крокфорда
JS Fiddle
Это оповещения ...
источник
that
переменная вообще не используется в его примере. Это выглядит так, как будто создание переменной-держателяthis
делает что-то с остальным кодом.Это хак, чтобы заставить внутренние функции (функции, определенные внутри других функций) работать так, как они должны. В JavaScript, когда вы определяете одну функцию внутри другой,
this
автоматически устанавливается глобальная область видимости. Это может сбить с толку, потому что вы ожидаетеthis
иметь то же значение, что и во внешней функции.Это определенно проблема, когда вы создаете функцию как метод объекта (как
car.start
в примере), а затем создаете функцию внутри этого метода (какactivateStarter
). В методе верхнего уровняthis
указывает на объект, это метод (в данном случаеcar
), но во внутренней функцииthis
теперь указывает на глобальную область. Это боль.Создание переменной для использования по соглашению в обеих областях является решением этой очень общей проблемы с javascript (хотя это также полезно в функциях jquery). Вот почему используется очень общее звучащее имя
that
. Это легко узнаваемое соглашение для преодоления недостатка в языке.Как El Ronnoco намекает на Дугласа, Крокфорд считает, что это хорошая идея.
источник
Использование
that
не является действительно необходимым, если вы делаете обходной путь с использованиемcall()
илиapply()
:источник
Иногда
this
может ссылаться на другую область и ссылаться на что-то другое, например, предположим, что вы хотите вызвать метод конструктора внутри события DOM, в этом случаеthis
будет ссылаться на элемент DOM, а не на созданный объект.HTML
JS
демонстрация
Решение выше воли Ассинга
this
дляthat
этого мы можем и доступ свойства имени внутриsayHi
метода изthat
, так что это может быть вызвано без проблем внутри вызова DOM.Другое решение - назначить пустой
that
объект и добавить к нему свойства и методы, а затем вернуть его. Но с этим решением вы потерялиprototype
конструктор.источник
Вот пример
Таким образом, вы можете видеть, что это значение - два разных значения в зависимости от целевого элемента DOM, но когда вы добавляете «this» в код выше, вы меняете значение «this», на которое вы нацелены.
..... $ (that) .css ("background-color", "# ffe700"); // Здесь значение "that" равно ".our-work-group> p> a", потому что значение var that = this; так что, хотя мы находимся в «this» = «.our-work-single-page», мы можем использовать «this» для манипулирования предыдущим элементом DOM.
источник