Все знают о this
javascript, но есть также примеры, self
встречающиеся в дикой природе, например здесь
Итак, в чем разница между this
и self
в JavaScript?
javascript
Бен Нельсон
источник
источник
window.self
(=== window
). Хотя OP, вероятно, означает тривиальное имя переменной…this === self
это правда :-)this
вself
настоящее время не является хорошей практикой, когда часто бывает код со многими (ну, более одного - это плохо) уровнями вложенности обратных вызовов, как следствие асинхронного программирования. Вместо этого используйте более информативное имя. Объективно говоря, само имяthis
не несет никакой информации и представляет собой лишь неплохой выбор имени, потому что лексический контекст определения класса квалифицирует его.Ответы:
Если не установлен в другом месте, то значение
self
являетсяwindow
потому , что JavaScript позволяет получить доступ к любой собственностиx
вwindow
качестве простоx
, вместоwindow.x
. Таким образом,self
действительноwindow.self
, что отличается отthis
.Если вы используете функцию, которая выполняется в глобальной области видимости и не находится в строгом режиме, по
this
умолчаниюwindow
используется и, следовательно,Если вы используете функцию в другом контексте,
this
будет ссылаться на этот контекст, ноself
все равно будетwindow
.Вы можете найти
window.self
определение объекта Window в рабочем проекте W3C 2006 здесь .источник
self
полезно в контексте WebWorker, когда окно недоступно ( developer.mozilla.org/en-US/docs/Web/Guide/Performance/… ). Использованиеself
вместоwindow
позволяет вам получить доступ к глобальному объекту переносимым способом.Небольшое дополнение к этому, поскольку люди могут столкнуться с этим в контексте сервис-воркеров, и в этом случае это означает что-то немного другое.
Вы можете увидеть это в модуле сервис-воркера:
Здесь self относится к WorkerGlobalScope, и это стандартный метод установки прослушивателей событий.
Из документов Mozilla :
источник
Хотя я здесь опоздал, я наткнулся на один пример, который тоже может быть полезен для
this
дальнейшего понимания :O / P
источник
Ссылка на ECMA 5 требует пояснения.
Я предполагаю, что это означает ECMA-262 Edition 5. Следует отметить, что ECMA-262 (также известный как ECMAScript или, менее точно, Javascript) - это общий язык сценариев, который был реализован в Интернет-браузерах. Из стандарта Edition 5.1:
Термин «глобальный объект» относится к любому объекту, находящемуся в верхней части цепочки областей видимости. Для браузеров это будет объект «окно», но это выбор реализации (Windows Script Host имеет невидимый глобальный объект, но не имеет строгого режима, поэтому неквалифицированные ссылки обращаются к его свойствам, а глобального «я» нет). Кроме того, "строгий режим" должен быть явно включен, иначе он не будет активен (раздел 14.1 стандарта). Таким образом, неопределенное «this» все равно будет преобразовано в глобальный объект (окно) в «ECMA 5» с неактивным строгим режимом.
Итак, ответ на вопрос:
«this» всегда относится к объекту, вызывающему функцию. Если функция не была вызвана объектом (т. Е. Не вызовом метода), то «this» (как передано в функцию) равно «undefined». Однако, если НЕ используется строгий режим, тогда неопределенное «this» устанавливается для глобального объекта (правило 2 выше).
«Я» не имеет особого синтаксического значения, это просто идентификатор. Браузеры обычно определяют window.self (просто свойство глобального объекта окна) = window. Это приводит к тому, что неквалифицированные ссылки на «self» являются такими же, как «window», ЕСЛИ «self» не было переопределено во включающей области (например, с помощью «var self = this;» выше. Удачи в переопределении «this»).
Итак, полное объяснение приведенного выше примера:
Интересный вариант примера создает замыкание, возвращая ссылку на внутреннюю функцию.
Производство
Обратите внимание, что внутренняя функция не вызывается, пока не будет вызвана yourObject. Итак, this.foo теперь является yourObject.foo, но self по-прежнему преобразуется в переменную в охватывающей области видимости, которая на момент возврата внутреннего объекта функции была (и в результирующем закрытии все еще остается) myObject. Итак, внутри внутренней функции «this» относится к объекту, вызывающему внутреннюю функцию, а «self» относится к объекту, который вызвал внешнюю функцию, чтобы создать ссылку на внутреннюю функцию.
Подводя итог резюме резюме, "this" определяется стандартом языка, "self" определяется тем, кто его определяет (разработчик среды выполнения или конечный программист).
источник
Найдите ниже несколько комбинаций консольных выходов «window», «self» и «this» в глобальной области (среде браузера), чтобы узнать, на что они ссылаются.
источник