
Привет всем! В этой статье мы поговорим о ключевом слове this в JavaScript. Раньше я немного плавал в этой теме, поэтому постараюсь объяснить ее вам, чтобы вы могли понять, как this используется и в каких ситуациях может пригодиться. Поехали!
Оглавление
- Что такое ключевое слово this
- Вызов this сам по себе
- Как вызвать this в методе объекта
- Как вызвать this в функции
- Как использовать this в слушателе событий
- Методы this (call, apply и bind)
Что такое ключевое слово this?
Итак, давайте начнем с определения того, что собой представляет ключевое слово this. В JavaScript ключевое слово this всегда ссылается на объект. Но дело в том, что объект, на который оно ссылается, будет меняться в зависимости от того, как и где вызывается this.
Ключевое слово this можно использовать по-разному. Мы рассмотрим наиболее распространенные случаи и то, как this ведет себя в каждом из них.
Важное замечание: this в JavaScript не является переменной — это ключевое слово, поэтому его значение не может быть изменено или переназначено.
Вызов this сам по себе
Если мы вызываем this отдельно, то есть не внутри функции, объекта или чего-либо еще, оно будет ссылаться на глобальный объект window.
Если вы напечатаете его как console.log('this alone', this);, вы получите в консоли следующее: [object Window].
Или вот это, если развернете:

Как вызвать this в методе объекта
this можно вызвать внутри метода объекта, как в следующем примере:
const person = {
firstName: "John",
lastName : "Doe",
id : 5566,
getThis : function() {
return this;
}
};
console.log('this in object method', person.getThis());
Мы увидим, что this больше не ссылается на сам объект:

И учитывая это, мы можем использовать this для доступа к другим свойствам и методам из того же объекта:
const person = {
firstName: "John",
lastName : "Doe",
id : 5566,
getFullName : function() {
return this.name + ' ' + this.lastName;
}
};
console.log('this in object method', person.getFullName());
Как вызвать this в функции
Мы можем вызвать this в функции, как в следующем примере:
function test() {
console.log('this in a function', this);
}
test()
Теперь this снова будет ссылаться на общий объект window, и мы получим в консоли следующее: [object Window].
Замечание о стрелочных функциях
В стрелочных функциях JavaScript задает this лексически. То есть стрелочная функция не создает свой собственный контекст выполнения, а наследует this от внешней функции, в которой она определена.
В большинстве случаев это означает, что this также будет ссылаться и на объект window:
const show = () => this
console.log('arrow function this', show())

Это важно, потому что если мы, например, попытаемся реализовать стрелочную функцию в качестве метода объекта, мы не сможем получить доступ к объекту при помощи ключевого слова this:
const person = {
name: 'Pedro',
surname: 'Sanchez',
sayName: () => this.name + ' ' + this.surname
}
console.log(person.sayName());

Замечание о строгом режиме
При использовании строгого режима вызов this внутри функции вернет undefined.
"use strict";
function show() {
console.log(this);
}
show();

Если вы не знаете, что такое строгий режим, обратитесь к документации MDN:
Режим strict (строгий режим), введённый в ECMAScript 5, позволяет использовать более строгий вариант JavaScript. Это не просто подмножество языка: в нем сознательно используется семантика, отличающаяся от обычно принятой.
Строгий режим принёс ряд изменений в обычную семантику JavaScript.
Во-первых, строгий режим заменяет исключениями некоторые ошибки, которые интерпретатор JavaScript ранее молча пропускал.
Во-вторых, строгий режим исправляет ошибки, которые мешали движкам JavaScript выполнять оптимизацию — в некоторых случаях код в строгом режиме может быть оптимизирован для более быстрого выполнения, чем код в обычном режиме.
В-третьих, строгий режим запрещает использовать некоторые элементы синтаксиса, которые, вероятно, в следующих версиях ECMAScript получат особый смысл.
Как использовать this в слушателе событий
При использовании в слушателе событий this будет ссылаться на элемент DOM, который вызвал событие.
document.getElementById('testBtn').addEventListener('click', function() {
console.log('this in a event', this);
})
В нашем случае мы добавили слушатель событий к элементу кнопки: <button id="testBtn">TEST</button>
Кликнув по кнопке, в консоли мы получим следующее:

Методы this (call, apply и bind)
JavaScript предоставляет три нативных метода, с помощью которых можно управлять поведением ключевого слова this. Это методы call, apply и bind. Давайте посмотрим, как они работают.
Как использовать метод call
С помощью call мы можем вызвать метод, передав в качестве аргумента объект-владелец. Говоря проще, мы можем вызвать метод, указав, к какому объекту будет относиться ключевое слово this.
Рассмотрим пример:
const person1 = {
name: 'Pedro',
surname: 'Sanchez',
sayName: function() {
return this.name + " " + this.surname;
}
}
const person2 = {
name: 'Jimena',
surname: 'Juarez'
}
console.log(person1.sayName.call(person2));
У нас есть два объекта person. Каждый из них имеет свойства name и surname, а объект person1 имеет метод sayName.
Мы вызываем метод sayName объекта person1 следующим образом: person1.sayName.call(person2).
Этим мы указываем, что при выполнении метода sayName ключевое слово this будет ссылаться не на объект, «владеющий» методом (person1), а на объект, который мы передали в качестве параметра (person2). Как следствие, в консоли мы получаем следующее:

Помните, что если данный метод принимает аргументы, то при вызове его с помощью call мы можем передать и их:
const person1 = {
name: 'Pedro',
surname: 'Sanchez',
sayName: function(city, country) {
return this.name + " " + this.surname + ", " + city + ", " + country;
}
}
const person2 = {
name: 'Jimena',
surname: 'Juarez'
}
console.log(person1.sayName.call(person2, "DF", "Mexico"));

Как использовать метод apply
Метод apply работает очень похоже на call. Единственное различие между ними заключается в том, что call принимает параметры в виде списка, разделенного двоеточиями (как в предыдущем примере), а apply — в виде массива.
Таким образом, если мы хотим повторить тот же пример с применением метода apply, мы должны сделать это следующим образом:
const person1 = {
name: 'Pedro',
surname: 'Sanchez',
sayName: function(city, country) {
return this.name + " " + this.surname + ", " + city + ", " + country;
}
}
const person2 = {
name: 'Jimena',
surname: 'Juarez'
}
console.log(person1.sayName.apply(person2, ["DF", "Mexico"]));

Как использовать метод bind
Как и call и apply, метод bind указывает объект, на который будет ссылаться ключевое слово this при выполнении данного метода.
Отличие метода bind в том, что он возвращает новую функцию, не выполняя ее. В то время как при использовании call и apply функция выполняется сразу, при использовании bind мы должны выполнить ее отдельно.
Рассмотрим это на примере:
const person1 = {
name: 'Pedro',
surname: 'Sanchez',
sayName: function() {
return this.name + " " + this.surname
}
}
const person2 = {
name: 'Jimena',
surname: 'Juarez'
}
const sayPerson2Name = person1.sayName.bind(person2)
console.log(sayPerson2Name())

Подведение итогов
Как всегда, я надеюсь, что вам понравилась статья и вы узнали что-то новое. Прочитав эту статью, вы познакомились с ключевым словом this в JavaScript и его поведением в разных ситуациях.
Перевод статьи «How to Use the «this» Keyword in JavaScript».
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]


