JavaScript - this Keyword

Привет, будущие разработчики JavaScript! Сегодня мы отправляемся в увлекательное путешествие в мир ключевого слова this. Как ваш доброжелательный邻居-преподаватель информатики, я здесь, чтобы помочь вам понять это иногда сложное, но всегда fascinирующее понятие. Так что возьмите любимый напиток, устройтесь поудобнее и погружайтесь с нами!

JavaScript - this Keyword

Что такое ключевое слово 'this'?

Представьте, что вы на вечеринке, и кто-то кричит: "Эй, ты!" Кто повернется? Все, верно? Но если бы они сказали: "Эй, Сара!", только Сара бы ответила. В JavaScript ключевое слово this похоже на说法 "Эй, ты!" к объекту. Это способ ссылаться на текущий объект в контексте.

Ключевое слово this - это особый идентификатор, который автоматически определяется в scope каждой функции. Но вот загвоздка - его значение зависит от того, как вызывается функция. Эта динамическая природа this делает его и мощным, и иногда сбивающим с толку.

На какой объект ссылается 'this'?

Теперь事情 становятся интересными. Объект, на который ссылается this, может изменяться в зависимости от того, как и где он используется. Это как хамелеон, который меняет свой цвет в зависимости от окружающей среды. Давайте рассмотрим несколько сценариев:

Синтаксис

Прежде чем мы углубимся, давайте быстро посмотрим, как мы используем this:

console.log(this);

Просто, правда? Но не дайте его простоте обмануть вас. Магия (или пакость) происходит, когда мы используем его в разных контекстах.

JavaScript 'this' в глобальном scope

Когда используется в глобальном scope (вне любой функции), this ссылается на глобальный объект. В браузере это usually window объект.

console.log(this === window); // true

this.myGlobalVar = "Я глобальный!";
console.log(window.myGlobalVar); // "Я глобальный!"

Здесь this как ВИП-пропуск, который gives вам доступ ко всему празднику (глобальный scope).

JavaScript 'this' в функции

Когда this используется внутри обычной функции, его значение зависит от того, как вызывается функция.

function showThis() {
console.log(this);
}

showThis(); // window (в нестрогом режиме)

В этом случае this как потерявшийся щенок, который附着自己 к тому, что рядом - что в нестрогом режиме это глобальный объект.

'this' в функции в строгом режиме

Строгий режим как строгий учитель, который не позволяет вам увиливать. В строгом режиме this внутри функции undefined,除非显式но установлено.

"use strict";
function strictThis() {
console.log(this);
}

strictThis(); // undefined

'this' в конструкторской функции

Когда функция используется как конструктор (с ключевой фразой new), this ссылается на newly созданный объект.

function Person(name) {
this.name = name;
this.greet = function() {
console.log("Привет, я " + this.name);
};
}

const john = new Person("John");
john.greet(); // "Привет, я John"

Здесь this как свидетельство о рождении, устанавливающее личность newly рожденного объекта.

'this' в стрелочной функции

Стрелочные функции - это rebels JavaScript мира. Они не привязывают свое собственное this, но наследуют его от окружающего scope.

const obj = {
name: "Алиса",
sayHello: () => {
console.log("Привет, " + this.name);
}
};

obj.sayHello(); // "Привет, undefined"

В этом случае this в стрелочной функции не ссылается на obj, но на surrounding scope (вероятно, глобальный scope).

'this' в методе объекта

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

const car = {
brand: "Toyota",
getBrand: function() {
return this.brand;
}
};

console.log(car.getBrand()); // "Toyota"

Здесь this как верный слуга, всегда ссылающийся на своего хозяина (объект).

'this' в функции внутри метода объекта

Здесь事情 могут become сложными. В функции внутри метода this больше не ссылается на объект.

const restaurant = {
name: "Вкусные угощения",
getMenu: function() {
function displayName() {
console.log(this.name);
}
displayName();
}
};

restaurant.getMenu(); // undefined

В этом случае this в displayName() ссылается на глобальный объект, а не на restaurant.

JavaScript 'this' в обработчиках событий

В обработчиках событий this обычно ссылается на элемент, который получил событие.

<button id="myButton">Нажми меня!</button>

<script>
document.getElementById("myButton").addEventListener("click", function() {
console.log(this); // <button id="myButton">Нажми меня!</button>
});
</script>

Здесь this как световое пятно, фокусирующееся на звезде шоу - элементе, который был clicked.

Явное связывание функции в JavaScript

Иногда мы хотим быть начальником и сказать this exactly что он должен быть. Мы можем сделать это, используя call(), apply(), или bind().

const person1 = { name: "Алиса" };
const person2 = { name: "Боб" };

function sayHello() {
console.log("Привет, " + this.name);
}

sayHello.call(person1); // "Привет, Алиса"
sayHello.apply(person2); // "Привет, Боб"

const boundHello = sayHello.bind(person1);
boundHello(); // "Привет, Алиса"

Эти методы как режиссер,казывающий this exactly какую роль играть.

Приоритет связывания 'this' в JavaScript

Теперь давайте подведем итог приоритета связывания this:

Rule Precedence
new keyword 1 ( Highest)
Explicit binding (call, apply, bind) 2
Method invocation 3
Function invocation 4 (Lowest)

помните, что стрелочные функции особенные и всегда наследуют this от surrounding scope.

И вот оно,folks! Мы отправились в путешествие по земле this, исследуя его многие лица и странности. Помните, понимание this как учиться ездить на велосипеде - сначала это может быть неуверенно, но с практикой вы будете мчаться без проблем. Продолжайте программировать, продолжайте исследовать и, самое главное, продолжайте весело проводить время с JavaScript!

Credits: Image by storyset