0Pricing
JavaScript Academy · Урок

Лексический и динамический this, повторение стрелочных функций

Посмотрите, как динамический this зависит от места вызова, а стрелочные функции захватывают лексический this; используйте небольшие понятные примеры

«Лексический и динамический this, повторение стрелочных функций» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 3 уроков всего.

Общая картина

Цель: понимать, на что указывает this в разных ситуациях.

  • Динамический this: определяется местом вызова
  • this в arrow: захватывается лексически
  • Распространённая ошибка: извлечение метода лишает его this
  • Используйте arrow, чтобы сохранять this внутри обратных вызовов
Лексический и динамический this, повторение стрелочных функций — иллюстрация 1

Демонстрация динамического this

Динамический this: вызов в виде obj.method() устанавливает this = obj; извлечение функции лишает её объекта.

// Dynamic this depends on HOW we call the function
const person = {
  name: "Ayla",
  say: function () {
    return "Hi " + this.name;
  }
};

console.log("method call:", person.say()); // "Hi Ayla"

// Extract then call: this is lost
const talk = person.say;
console.log("extracted call:", talk()); // likely "Hi undefined" in strict mode -> this is undefined
Лексический и динамический this, повторение стрелочных функций — иллюстрация 2

Arrow = лексический this

Arrow получает this из окружающей функции или области видимости объекта при создании; во время вызова он не меняется.

// Arrow functions capture this from where they are created
const box = {
  label: "blue",
  showLater: function () {
    // Arrow keeps this === box
    const fn = () => "box:" + this.label;
    return fn();
  }
};

console.log("arrow captured this:", box.showLater()); // "box:blue"
Лексический и динамический this, повторение стрелочных функций — иллюстрация 3

Обратные вызовы: сохраняйте this с помощью arrow

В обратных вызовах normal функция часто теряет this, а arrow сохраняет внешний this без изменений.

// Using a normal function in a callback can lose this
const widget = {
  id: 7,
  normal: function () {
    setTimeout(function () {
      // here this is not widget in many environments
      console.log("normal cb this.id:", this && this.id);
    }, 0);
  },
  arrow: function () {
    setTimeout(() => {
      // arrow keeps lexical this from arrow()
      console.log("arrow cb this.id:", this.id);
    }, 0);
  }
};

widget.normal();
widget.arrow();
Лексический и динамический this, повторение стрелочных функций — иллюстрация 4

Простое решение для извлечённого метода

Если метод извлечён, оберните его небольшой arrow, замыкающей объект, или привяжите его (в следующем уроке). Для начинающих лучше не усложнять решение.

// If you must extract, wrap with an arrow capturing the object
const account = {
  owner: "Mila",
  label: function () { return "Owner:" + this.owner; }
};

// Lost this:
const lost = account.label;
console.log("lost:", lost()); // "Owner:undefined" (this missing)

// Fixed: create an arrow that closes over account
const safe = () => account.label();
console.log("fixed via arrow wrapper:", safe());
Лексический и динамический this, повторение стрелочных функций — иллюстрация 5

Хорошие привычки

Советы:

  • Методы: вызывайте их как obj.method(), чтобы this был объектом.
  • Обратные вызовы: предпочитайте arrow, чтобы сохранять лексический this.
  • Извлечённые методы теряют this; оборачивайте их в arrow или привязывайте.
Лексический и динамический this, повторение стрелочных функций — иллюстрация 6

Викторина о this в arrow

Быстрая проверка: поведение this в arrow.

Лексический и динамический this, повторение стрелочных функций — иллюстрация 7

Итоги

Итоги: в normal-функциях this является динамическим (задаётся местом вызова), а в arrow — лексическим (захватывается при создании). Используйте arrow в обратных вызовах и оборачивайте извлечённые методы, чтобы сохранить простое поведение.

Лексический и динамический this, повторение стрелочных функций — иллюстрация 8

Часто задаваемые вопросы

Урок «Лексический и динамический this, повторение стрелочных функций» бесплатный?

Да — полный текст урока «Лексический и динамический this, повторение стрелочных функций» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 3 уроков всего.

Чему я научусь в уроке «Лексический и динамический this, повторение стрелочных функций»?

Посмотрите, как динамический this зависит от места вызова, а стрелочные функции захватывают лексический this; используйте небольшие понятные примеры Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать JavaScript Academy?

Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Лексический и динамический this, повторение стрелочных функций»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке JavaScript Academy?

Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Лексический и динамический this, повторение стрелочных функций
  2. Подводные камни извлечения методов и частичное применение
  3. Функциональные альтернативы — явная передача контекста, замыкания и небольшие помощники
← Назад к JavaScript Academy