Когда определяется this в JavaScript

Ключевое слово `this` в JavaScript ставит в тупик всех разработчиков — от джунов до сеньоров. В первой из двух частей углубимся в основы, необходимые для лучшего понимания `this` и того, как он работает.

Первые несколько лет своей карьеры я рассматривал `this` как ещё один аспект моего основанного на интуиции подхода к веб-разработке — то есть иногда мне казалось, что `this` может быть тем, чего я хочу, но если это так, то по причинам, которые я не мог понять.

Иногда я оказывался прав — к моей весьма скромной чести, — но не потому, что я знал, почему или что-то в этом роде. Теперь, после многих лет, проведённых в раздумьях, методах проб и ошибок, а также заглядывая в Stack Overflow так долго, как только позволяли надвигающиеся сроки, я думаю, что довольно хорошо разобрался в `this`. То есть, плюс-минус эмоциональная поддержка `console.log` время от времени; я всего лишь человек.

Для меня проблема всегда заключалась в том, что `this` — это контекст, но этот контекст не столько важен для нас, разработчиков, сколько важен для JavaScript. Мы привыкли указывать JavaScript, что это за вещи: это идентификатор, который мы ввели, где мы его ввели, с охватом пары скобок, установленных вокруг него, и он имеет значение, которое мы ему присвоили.

Это не относится к `this`, который — следите за этим — является ключевым словом, ссылающимся на объект, связанный с функцией, в которой вызывается `this`, в тот момент, когда эта функция вызывается.

Это кошмарное предложение, я знаю, но потерпите. Оно сводится к двум важным понятиям: `this` ссылается на объект, связанный с функцией, а объект, на который ссылается `this`, определяется в момент вызова функции. Как только разберётесь с этими двумя аспектами, `this` станет… ну, всё ещё немного странным, но вполне понятным.

На высшем уровне "объект, связанный с функцией" имеет смысл, если рассматривать его с точки зрения сущности JavaScript: объекты с методами, ссылающиеся на объекты с методами, всё ниже и ниже. Почти любой код, который выполняется в любом месте сценария, так или иначе связан с объектом, явно или неявно. Не сказал бы, что это сложная тема, но мы к ней ещё вернёмся.

Мы не можем понять что, не разобравшись сначала в когда, и, на мой взгляд, "в момент вызова функции" — это то, что делает `this` особенно сложным для понимания. Значение `this` определяется не записью, а вызовом функции — то есть значение `this` внутри функции может быть разным при каждом вызове этой функции. Чтобы понять это, необходимо думать скорее о JavaScript, выполняющем функцию, чем о человеке, набирающем функцию на клавиатуре.

2
2 комментария