«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему «это» не относится к вызывающей функции в обратных вызовах JavaScript?

Почему «это» не относится к вызывающей функции в обратных вызовах JavaScript?

Опубликовано 24 ноября 2024 г.
Просматривать:860

Why Doesn\'t \'this\' Refer to the Calling Function in JavaScript Callbacks?

Когда это спорит: понимание «это» в функциях обратного вызова

В JavaScript значение this при вызове функции определяется контекст, в котором выполняется функция. Однако при передаче этого параметра в качестве аргумента правила могут усложниться.

В частности, возникает следующий сценарий: когда функция обратного вызова передается в качестве аргумента, почему это не устанавливается в функцию, которая вызывает обратный вызов?

Понимание иерархии 'this'

Чтобы понять, почему это установлено там, где оно есть, нам нужно рассмотрим иерархию вызовов функций:

  • obj.prepareRandomFunction() устанавливает для этого значение obj (правило №2 из ответа).
  • randomFunction(this.sumData.bind(this) ) передает this.sumData.bind(this) в качестве аргумента (правило №1).
  • Внутри случайной функции, callback(data) устанавливает это значение для глобального объекта (правило № 1).

Однако, прежде чем randomFunction вызывает обратный вызов, она использует this.sumData.bind(this) для создания новой функции (правило №5). Эта новая функция вызывает исходную функцию обратного вызова, но теперь с привязкой к obj (аргумент, переданный в функцию связывания).

Последствия для функций обратного вызова

При передаче метода в качестве обратного вызова важно понимать, что он не будет вызываться как obj.method(). Это означает, что внутри функции обратного вызова не будет правильного значения. Чтобы обойти эту проблему, вы можете использовать метод метода метода Bind() для установки значения this в обратном вызове.

Другие полезные примечания

  • Правило №6 в ответ описывает, как стрелочные функции ES6 поддерживают текущее лексическое значение this даже в функциях обратного вызова.
  • .apply() и .call() можно использовать для создания новые вызовы функций с определенными значениями this.
  • bind() можно использовать для создания новых функций, которые вызывают исходную функцию с пользовательским значением this.
  • Понимание сложной природы этого требует необходим для эффективного кодирования JavaScript и для освоения таких понятий, как обратные вызовы.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3