Как уже говорили другие: эта "дополнительная переменная" (на некотором уровне) является единственным способом узнать о том, что this
является специальным выражением и, таким образом, не будучи переменной, не связано в контексте выполнения/closure.
Тем не менее, я думаю, что вы спрашиваете (или я действительно хочу ответить):
Стоит ли ставить var self = this
наверхукаждый метод / конструктор?
Резюме
Хотя я пытался сделать это один раз, и у меня возник тот же вопрос, я больше не использую этот подход.Теперь я оставляю за собой конструкцию, когда мне нужен доступ в закрытии.Для меня это добавляет немного "эй, это то, что я действительно хочу!"семантически для моего кода:
this -> this
и self -> this (but really that) in a closure
Вопросы ala carte:
... Хотя это обычно делается, эточувствует себя немного не так.То, что я надеюсь найти в этом вопросе, - лучший способ справиться с этим, или что-то, чтобы убедить меня, что все в порядке.
Делайте то, что чувствует себя правильно для вас.Не бойтесь попробовать один метод и переключиться обратно позже (но, пожалуйста, старайтесь оставаться последовательными в каждом проекте: -)
Это стандартный способ сохранить правильные привязки?Должен ли я стандартизировать использование «везде» везде, кроме случаев, когда мне явно нужно «это».
«Я» - наиболее распространенное имя.Как указано выше, я предпочитаю противоположный подход - использовать this
за исключением случаев, когда требуется привязка замыкания.
.., если это считается немного злым и почему.
Зло - это глупый субъективный термин (хотя иногда и забавный).Я никогда не говорил, что это зло, просто почему я не придерживаюсь подхода.Некоторые люди говорят мне, что я "злой" за то, что я не использую точки с запятой.Я говорю им, что на самом деле они должны выдвигать хорошие аргументы и / или лучше изучать JavaScript: -)
Я знаю, что есть также встроенная функция javascript 'apply' для явного определенияобласть при вызове метода.Это лучше?
Проблема с apply/call
заключается в том, что вы должны использовать их в точке вызова функции.Это не поможет, если кто-то еще вызовет один из ваших методов, поскольку this
может быть уже выключен.Это наиболее полезно для таких вещей, как обратные вызовы в стиле jQuery, где this
является элементом / элементом обратного вызова и т. Д.
В качестве отступления ...
I хотелось бы избегать «потребности себя» в элементах и, таким образом, обычно переводить все функции-члены в свойства, в которых получатель (this
) просто «протекает», что обычно «как ожидалось».
«Приватные» методы в моем коде начинаются с «_», и если пользователь вызывает их, это на них.Это также работает лучше (требуется, действительно), когда используется прототипный подход к созданию объекта.Однако Дуглас Крокфорд не согласен с моим «частным» подходом, и в некоторых случаях цепочка поиска может помешать вам, введя неожиданный получатель:
Использование границы «self» в конструкторе также блокирует верхний предел цепочки поиска для метода (он больше не полиморфен вверх!), Который может быть или не быть правильным.Я думаю, что это обычно неправильно.
Удачного кодирования.