Перейти к основному содержимому

Запрет на "this"

@serverSerrverlesskiy

Удаление ключевого🗝️ слова 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.

Poor

Но this теряет контекст во многих ситуациях (неизвестно возвращаемое значение):

  • теряет контекст внутри вложенных функций
  • теряет контекст в обратных вызовах (callback)
  • this теряет контекст, когда метод используется в качестве обработчика события.

Лучший язык

The_best

JavaScript — это и функциональный язык программирования, и язык на основе прототипов. Если мы избавимся от this, у нас останется JavaScript как функциональный⚙️ язык программирования. Это даже лучше!

В то же время, без this JavaScript предлагает новый, уникальный способ выполнения объектно-ориентированного программирования без классов и наследования.

Отказ от this

remember

Лучший способ избежать связанных с this проблем — вообще не использовать this!

JavaScript

JavaScript без this выглядит как лучший функциональный⚙️ язык программирования!

Мы можем создавать инкапсулированные объекты без использования this в качестве коллекций закрытий. С помощью React Hooks мы можем создавать без this компоненты с сохранением состояния.

Ключевое слово this не может быть удалено из JavaScript, без разрушения всех существующих приложений. Однако что можно сделать? Мы можем написать собственный код без this и позволить его использовать только в библиотеках. Тем временем вводятся новые правила ESLint, запрещающие использование this.

Так как в прошлом уроке мы отказались от классов, то и вместе с ними прощаемся и с this.

EnglishMoji!

Проблемы?

Problem

Пишите в Discord или телеграмм чат, а также подписывайтесь на наши новости

JavaScript Camp

Вопросы

Question

Можно ли обойтись без this:

  1. Можно, и лучше вообще не использовать
  2. Можно, но не целесообразно
  3. Нельзя, т.к. this не может быть удален из JavaScript

JavaScript без this выглядит как лучший:

  1. Функциональный язык программирования
  2. Процедурный язык программирования
  3. Логический язык программирования

Для того чтобы понять, на сколько вы усвоили этот урок, пройдите тест в мобильном приложении нашей школы по этой теме или в нашем телеграм боте.

EnglishMoji!

Ссылки

  1. Статья "Удаление ключевого слова «this» из JavaScript делает язык лучше"
  2. Статья "Ключевое слово this в JavaScript"
  3. MDN web doc. Статья "this"

Contributors ✨

Thanks goes to these wonderful people (emoji key):


Dmitriy K.


Dmitriy Vasilev

💵

Resoner2005

🐛 🎨 🖋

Navernoss

🖋 🐛 🎨