Несколько слов об «этом»:
Ключевое слово
this
функции ведет себя в JavaScript немного иначе, чем в других языках. Он также имеет некоторые отличия между строгим режимом и нестрогим режимом.
Это значение — это свойство контекста выполнения (глобального, функционального или eval), которое в нестрогом режиме всегда является ссылкой на объект, а в строгом режиме может быть любым значением.
📓 Несколько советов:
- Определяется тем, как вызывается функция (привязка среды выполнения) и может быть разной при каждом вызове.
- Не может быть установлено назначением.
Вопросы❓
- Каков будет вывод следующего кода (запишите их в последовательном порядке для проверки)?
[Примечание: представьте, что этот код запускается в консоли отладчика современного браузера. Также этот код не запускается в строгом режиме.]
console.log(this) function Foo () { console.log(this); } Foo(); Foo.call(); Foo.apply(); var foo = new Foo(); var bar = { name: 'Bar' }; Foo(bar); Foo.call(bar); Foo.apply(bar);
Проверяйте результаты 😏
Чтобы не видеть результатов, я разместил его в этой корзине. Вы также можете подтвердить результаты, вставив код в любую консоль отладчика.
Должные объяснения 😅
- Поскольку значение this зависит от контекста, то this в глобальном контексте будет относиться к объекту window.
- В нестрогом режиме значением
this
в таком случае будет глобальный объект (window
в браузере, мы вернемся к нему позже в главе Глобальный объект). Это историческое поведение, которое"use strict"
исправляет. - То же, что 2.
- То же, что 2.
- При создании объекта из функции-конструктора this относится к вновь созданному объекту.
- То же, что 2.
- Метод вызова принимает первый параметр в качестве контекста, поэтому, если мы предоставляем объект, он становится контекстом.
❓What if we don’t pass the argument?
❓ - То же, что 6.
Дополнительно 🌻
- Какими будут ваши ответы, если я поставлю
‘use strict’;
вверху? 😛 - Забавный факт: в ES5 был представлен метод
bind()
для установки значенияthis
функции независимо от того, как она вызывается, а в ES2015 были представлены стрелочные функции, которые не предоставляют свою собственную привязкуthis
(она сохраняет значениеthis
прилагаемого лексического контекст).
Аригато
Спасибо, что нашли время прочитать эту историю. Я попытался дать несколько хороших вопросов и объяснений. Пожалуйста, дайте мне знать, где это можно улучшить. Также я думаю о том, чтобы взять небольшие темы и создать короткие рассказы (2 минуты чтения), посвященные каждой из них. Что мне выбрать дальше?