Запрет на "this"
Удаление ключевого🗝️ слова this
из JavaScript делает язык лучше!
Причина в том, что this
зависит от того, как была вызвана функция⚙️, а не от того, где она была определена. Поэтому this
в JavaScript является источником большой путаницы в языке .
Использование this
гарантирует, что функция работает именно с тем объектом, в контексте которого вызвана.
Через this
метод можно не только обратиться к любому свойству объекта, но и передать куда-то ссылку на сам объект целиком (снижая безопасность приложения).
Значение this
называется контекстом вызова и будет определено в момент вызова функции. Например, такая функция, объявленная без объекта, вполне допустима:
functionsay Hi() {
console.log(this.firstName)
}
Эта функция ещё не знает, каким будет this
. Это выяснится при выполнении программы.
Если одну и ту же функцию запускать в контексте разных объектов, она будет получать разный this
:
var user = { firstName: 'Джони' }
var admin = { firstName: 'Админ' }
function funcName() {
console.log(this.firstName)
}
user.f = funcName
admin.g = funcName
//this равен объекту перед точкой:
user.f() //Джони
admin.g() //Админ
admin['g']() //Админ (доступ к объект реализован через квадратные скобки)
Итак, значение this
не зависит от того, как функция была создана, оно определяется исключительно в момент вызова.
Видео
this
и его недостатки
Методы — это функции⚙️, которые хранятся в объектах. Для того, чтобы функция⚙️ знала, над каким объектом работать, используется this.
Но this
теряет контекст во многих ситуациях (неизвестно возвращаемое значение):
- теряет контекст внутри вложенных функций
- теряет контекст в обратных вызовах (callback)
this
теряет контекст, когда метод используется в качестве обработчика события.
Лучший язык
JavaScript — это и функциональный язык программирования, и язык на основе прототипов. Если мы избавимся от this
, у нас останется JavaScript как функциональный⚙️ язык программирования. Это даже лучше!
В то же время, без this
JavaScript предлагает новый, уникальный способ выполнения объектно-ориентированного программирования без классов и наследования.
Отказ от this
Лучший способ избежать связанных с this
проблем — вообще не использовать this
!
JavaScript без this выглядит как лучший функциональный⚙️ язык программирования!
Мы можем создавать инкапсулированные объекты без использования this
в качестве коллекций закрытий. С помощью React Hooks мы можем создавать без this
компоненты с сохранением состояния.
Ключевое слово this
не может быть удалено из JavaScript, без разрушения всех существующих приложений. Однако что можно сделать? Мы можем написать собственный код без this
и позволить его использовать только в библиотеках. Тем временем вводятся новые правила ESLint,
запрещающие использование this
.
Так как в прошлом уроке мы отказались от классов, то и вместе с ними прощаемся и с this
.
Проблемы?
Пишите в Telegram или ВКонтакте, а также подписывайтесь на наши новости
Вопросы
Можно ли обойтись без this
:
- Можно, и лучше вообще не использовать
- Можно, но не целесообразно
- Нельзя, т.к.
this
не может быть удален из JavaScript
JavaScript без this
выглядит как лучший:
- Функциональный язык программирования
- Процедурный язык программирования
- Логический язык программирования
Для того чтобы понять, на сколько вы усвоили этот урок, пройдите тест в мобильном приложении нашей школы по этой теме или в нашем телеграм боте.
Ссылки
- Статья "Удаление ключевого слова «this» из JavaScript делает язык лучше"
- Статья "Ключевое слово this в JavaScript"
- MDN web doc. Статья "this"
Contributors ✨
Thanks goes to these wonderful people (emoji key):
Dmitriy K. | Dmitriy Vasilev 💵 | Resoner2005 🐛 🎨 🖋 | Navernoss 🖋 🐛 🎨 |