Как вы называете переменную, когда нужно сохранить this
в замыкании?
Вопрос не праздный, ведь это дело даже не личного вкуса, а, скорее, договоренности.
В коде проекта, над которым я сейчас активно работаю, можно было с равной степенью вероятности
встретить that
и self
.
Через два года разработки, впрочем, баланс заметно сместился в сторону that
.
Но знаете, что? И self
, и that
, и даже _this
с me
— это очень хреновые названия.
Представим скрипт, который срывает ягоды тутовника (такие маленькие и сильно пачкаются). Делаем все круто и объектно-ориентированно:
function MulberryPlucker() {}
MulberryPlucker.prototype.pluckedMulberry = null;
MulberryPlucker.prototype.pluck = function() {
var that = this;
var asyncPlucker = new AsyncPlucker('mulberry');
asyncPlucker.pluck(function(mulberry) {
that.pluckedMulberry = mulberry;
});
}
Вы можете сказать, это такое? В смысле, что означает that
?
Пока что да, хорошо, а так?
function MulberryPlucker() {}
MulberryPlucker.prototype.pluckedMulberry = null;
MulberryPlucker.prototype.pluck = function() {
var that = this;
AsyncPluckerAsyncFactory.createPlucker(function(asyncPlucker) {
asyncPlucker.onreadystatechange = function() {
if (asyncPlucker.readyState === asyncPlucker.STATE_READY) {
asyncPlucker.pluck(function(mulberry) {
if (typeof GlobalNotifier !== 'undefined'){
GlobalNotifier.notifyNewMulberry(mulberry);
}
that.pluckedMulberry = mulberry;
});
}
}
asyncPlucker.setTypeAsync('mulberry');
})
}
Уже сложнее. А если добавить ещё десяток уровней вложенности и кода экрана два? Или так: в рабочий чатик прилетает сообщение, мол, а что делает эта функция?
function(mulberry) {
that.pluckedMulberry = mulberry;
}
Вы сможете ответить точно и сразу?
Увы, это реальность, код не находится в кристально чистом состоянии, и не всегда код, который мы поддерживаем — это
код, который мы писали.
И чтобы как-то сгладить эффекты этой самой реальности мы, программисты, называем переменные
понятными именами. Так почему же, чёрт возьми, не делать то же самое с this
.
А очень просто. Точно так же, как конструктор, только с маленькой буквы.
Т.е., если this
представляет собой инстанс EvilDestructionWidget
, то его имеет смысл обозвать
evilDestructionWidget
.
И код чудесным образом становится более понятным:
function MulberryPlucker() {}
MulberryPlucker.prototype.pluckedMulberry = null;
MulberryPlucker.prototype.pluck = function() {
var mulberryPlucker = this;
var asyncPlucker = new AsyncPlucker('mulberry');
asyncPlucker.pluck(function(mulberry) {
mulberryPlucker.pluckedMulberry = mulberry;
});
}
Ну, разве не красота?
Да. Везде. Это всегда так, «ой, у меня всего-лишь маленький скриптик, пусть всё будет валяться в глобале…», и чем это заканчивается?
А вы разве не минифицируете скрипты? Очень советую. Тем более, что такие переменные обычно не «торчат» наружу и прекрасно переименовываются минификатором во что-нибудь однобуквенное.
Я вас умоляю. Вы знаете, как работает this
, что такое замыкание, и пишете код в notepad.exe?
Наверняка ваш редактор умеет делать подстановку.
А зря. Переименуйте везде на большую и не позорьтесь.
Ладно, тогда можно. Но вы в курсе, это отвратительное имя для конструктора.
Мне кажется, что идея не самая лучшая.
Программисты ожидают, что эта переменная будет называться
self
,that
или_this
. Некоторые стайлгайды даже закрепляют одно из этих названий. Видеть незнакомую переменную в такой роли будет запутывать других разработчиков.Практика подобных названий закрепилась во времена, когда в браузерах по умолчанию не было родной реализации
Function.prototype.bind
. Сегодня, когда она у нас есть, лучшее название дляthis
- этоthis
:С ES6, который при помощи транспайлеров можно смело использовать уже несколько лет как, проблема решается еще проще, как выше показал @unknownexception