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

Как сохранить контекст с помощью this при использовании setTimeout в JavaScript?

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

How to Preserve Context with `this` When Using `setTimeout` in JavaScript?

Использование setTimeout и сохранение контекста с этим в JavaScript

При использовании функции setTimeout в JavaScript важно знать, как она обрабатывается контекст этого. Это становится особенно актуальным при вызове методов, определенных в другом контексте в обратном вызове таймаута.

В предоставленном фрагменте кода функция метода вызывает метод2, который извлекает элемент изображения на основе переданного идентификатора и устанавливает его свойство src. . Первоначально метод2 выполняется успешно. Однако после задержки setTimeout возникает ошибка, поскольку функция метода2 больше не определена в предполагаемом контексте.

Проблема возникает потому, что setTimeout создает новый контекст выполнения, а ключевое слово this по умолчанию используется для глобального объекта. В предоставленном коде функция метода вызывается с использованием контекста тестового прототипа, но когда выполняется обратный вызов по тайм-ауту, контекст this меняется на глобальный объект.

Решение:

Чтобы сохранить предполагаемый контекст this в обратном вызове тайм-аута, вы можете использовать метод .bind(), чтобы явно установить привязку контекста. Добавляя .bind(this) в конец функции, передаваемой в setTimeout, вы можете гарантировать, что this в функции обратного вызова относится к предполагаемому контексту.

В обновленном фрагменте кода:

test.prototype.method = function()
{
    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";
    timeDelay = window.setTimeout(this.method.bind(this), 5000);
    //                                       ^^^^^^^^^^^ <- fix context
};

Добавив .bind(this), ключевое слово this в функции обратного вызова будет привязано к тестовому прототипу, что позволит правильно вызывать метод2 в контексте метода-прототипа даже после задержки setTimeout.

Заявление о выпуске Эта статья перепечатана по адресу: 1729735296. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3