В исходном тексте для WebKit HTML 5 SQL Storage Notes Demo я увидел следующее :
function Note() {
var self = this;
var note = document.createElement('div');
note.className = 'note';
note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
note.addEventListener('click', function() { return self.onNoteClick() }, false);
this.note = note;
// ...
}
Автор использует себя в некоторых местах (функция тела) и это в других местах (тела функций , определенные в списке аргументов методов). В чем дело? Теперь, когда я заметил это однажды, я начну видеть это везде?
javascript
scope
closures
Thomas L Holaday
источник
источник
this
внутри обратного вызова?»)Ответы:
Смотрите эту статью на alistapart.com . (Ред .: статья была обновлена с момента ссылки)
self
используется для сохранения ссылки на оригинал,this
даже если контекст меняется. Эта техника часто используется в обработчиках событий (особенно в замыканиях).Изменить: Обратите внимание, что использование
self
теперь не рекомендуется, посколькуwindow.self
существует и может привести к ошибкам, если вы не будете осторожны.То, что вы называете переменной, не имеет особого значения.
var that = this;
хорошо, но в названии нет ничего волшебного.Функции, объявленные внутри контекста (например, обратные вызовы, замыкания), будут иметь доступ к переменным / функциям, объявленным в той же области видимости или выше.
Например, простой обратный вызов события:
источник
var that = this;
Я думаю, что имя переменной «self» больше не следует использовать таким образом, поскольку современные браузеры предоставляют глобальную переменную,
self
указывающую на глобальный объект либо обычного окна, либо WebWorker.Чтобы избежать путаницы и потенциальных конфликтов, вы можете написать
var thiz = this
илиvar that = this
вместо.источник
_this
that
" (к которому мой мозг никогда не привыкнет).self
если вы объявите его какvar
iable, оно будет скрывать глобальное имя. Конечно, если вы забыли,var
тогда это не будет работать с любым другим именем.Да, вы увидите это повсюду. Это часто
that = this;
.Посмотрите, как
self
используется внутри функций, вызываемых событиями? У тех был бы собственный контекст, поэтомуself
он используется для удержания того,this
что вошлоNote()
.Причина
self
по-прежнему доступна для функций, даже если они могут выполняться только послеNote()
завершения выполнения функции, в том, что внутренние функции получают контекст внешней функции из-за закрытия .источник
self
не имеет особого значения. Лично я предпочитаю использовать переменную с именем, отличным от того,self
что меня часто смущает, так как я ожидаю, что «я» будет зарезервированным словом. Поэтому мне нравится ваш ответ. И в примере с OP, я бы предпочелvar thisNote = this
или подобное.Следует также отметить, что существует альтернативный шаблон Proxy для сохранения ссылки на оригинал
this
в обратном вызове, если вам не нравится этаvar self = this
идиома.Поскольку функцию можно вызывать с заданным контекстом с помощью
function.apply
илиfunction.call
, вы можете написать оболочку, которая возвращает функцию, которая вызывает вашу функцию с использованиемapply
илиcall
с использованием данного контекста. См.proxy
Функцию jQuery для реализации этого шаблона. Вот пример его использования:var wrappedFunc = $.proxy(this.myFunc, this);
wrappedFunc
затем может быть вызван и будет иметь вашу версию вthis
качестве контекста.источник
Как уже объяснили другие,
var self = this;
позволяет коду в замыкании возвращаться к родительской области.Тем не менее, сейчас 2018 год, и ES6 широко поддерживается всеми основными веб-браузерами.
var self = this;
идиома не так важна, как раньше.Теперь можно избежать
var self = this;
с помощью функций стрелок .В случаях, когда мы бы использовали
var self = this
:Теперь мы можем использовать функцию стрелки без
var self = this
:Функции со стрелками не имеют своих собственных
this
и просто принимают вмещающую область.источник
.addEventListender("click", (x) => { console.log(x); });
Вы очень четко объяснили, как и почему, и я согласен, что использование функций со стрелками имеет больше смысла, но все же ... это просто ужасное, ленивое, грязное программирование.Переменная фиксируется встроенными функциями, определенными в методе.
this
в функции будет ссылаться на другой объект. Таким образом, вы можете заставить функцию содержать ссылку наthis
внешнюю область видимости.источник
Это причуда JavaScript. Когда функция - это свойство объекта, более точно называемое методом, это относится к объекту. В примере обработчика события содержащий объект является элементом, который вызвал событие. Когда стандартная функция вызывается, это будет относиться к глобальному объекту. Когда у вас есть вложенные функции, как в вашем примере, это вообще не относится к контексту внешней функции. Внутренние функции делят область действия с содержащей функцией, поэтому разработчики будут использовать варианты
var that = this
, чтобы сохранить то, что им нужно во внутренней функции.источник
На самом деле self - это ссылка на window (
window.self
), поэтому, когда вы говорите,var self = 'something'
вы переопределяете ссылку на себя, потому что self существует в объекте window.Вот почему большинство разработчиков предпочитают
var that = this
болееvar self = this;
Тем не мение;
var that = this;
не соответствует хорошей практике ... предполагая, что ваш код будет пересмотрен / изменен позже другими разработчиками, вы должны использовать самые распространенные стандарты программирования в отношении сообщества разработчиковПоэтому вы должны использовать что-то вроде var
oldThis
/var oThis
/ etc - чтобы быть понятным в вашей области действия // .. это не так уж много, но сэкономит несколько секунд и несколько циклов мозгаисточник
Как уже упоминалось несколько раз выше, «я» просто используется, чтобы сохранить ссылку на «это» до входа в функцию. Однажды в функции «это» относится к чему-то другому.
источник
thisss.sayHi.call (thatt);
источник