Як сказали інші: Ця "додаткова змінна" є (на якомусь рівні) єдиним способом дізнатись про те, що thisє спеціальним виразом, і, отже, не є змінною, вона не пов'язана в контексті / закритті виконання.
Однак те, що, на мою думку, ви запитуєте (або що я справді хочу відповісти):
Чи слід ставити var self = thisвгорі кожен метод / конструктор?
Резюме
Хоча я спробував це один раз і мав те саме питання, я більше не використовую цей підхід. Тепер я резервую конструкцію, коли мені потрібен доступ у закритті. Для мене це додає трохи "агов, це те, що я справді хочу!" семантично до мого коду:
this -> this і self -> this (but really that) in a closure
Запитання ала карт:
... Незважаючи на те, що це зазвичай роблять, це здається трохи неправильним. Те, що я сподіваюся знайти в цьому питанні, - кращий спосіб вирішити це питання або щось, що переконає мене, що це цілком добре.
Робіть те, що вам подобається. Не бійтеся спробувати один із методів і повернутися пізніше (але, будь ласка, намагайтеся залишатися послідовними в кожному проекті :-)
Це стандартний спосіб зберігати правильні прив’язки? Чи повинен я стандартизувати використання "self" скрізь, якщо явно не потребую "this".
"self" - найпоширеніша назва, що використовується. Як зазначено вище, я віддаю перевагу протилежному підходу - використовувати, thisза винятком випадків, коли потрібно закриття прив'язки.
..якщо це вважається трохи злим і чому.
Зло - безглуздий суб’єктивний термін (хоч іноді і весело). Я ніколи не казав, що це зло, просто чому я не дотримуюся підходу. Деякі люди кажуть мені, що я "злий" за те, що не використовую крапки з комою. Я кажу їм, що вони насправді повинні привести вагомі аргументи та / або краще вивчити JavaScript :-)
Мені відомо, що існує також вбудована функція javascript 'apply', щоб чітко визначити область дії під час виклику методу. Чи краще?
Проблема в apply/callтому, що ви повинні використовувати їх у момент виклику функції. Це не допоможе, якщо хтось інший назве один із ваших методів якthis можливо, вже вимкнено. Це найбільш корисно для виконання таких речей, як зворотні виклики у стилі jQuery, де the thisє елементом / елементом зворотного виклику тощо.
Як осторонь ...
Мені подобається уникати "необхідності себе" членам і, таким чином, загалом підвищувати всі функції членів до властивостей, де приймач (this ) просто "протікає", що зазвичай "як очікується".
"Приватні" методи в моєму коді починаються з "_", і якщо користувач їх викликає, це на них. Це також працює краще (обов’язково, насправді) при використанні підходу прототипу до створення об’єкта. Однак Дуглас Крокфорд не погоджується з цим моїм "приватним" підходом, і є деякі випадки, коли пошуковий ланцюг може зірвати вас, вводячи несподіваний приймач:
Використання обмеженого в конструкторі "self" також блокує верхню межу ланцюжка пошуку для методу (він більше не поліморфний вгору!), Який може бути або не бути правильним. Я думаю, що це зазвичай неправильно.
Щасливого кодування.
var that = this, я, чесно кажучи, навіть не турбувався про те, щоб застосувати / зателефонувати, але зараз я прочитав про ці методи, дякую за це питання!