Передача, корректная “этот” контекст к setTimeout обратному вызову? [дубликат]

226
задан Nayuki 3 June 2015 в 20:21
поделиться

1 ответ

EDIT: В общем, еще в 2010 году, когда был задан этот вопрос, наиболее распространенным способом решения этой проблемы было сохранение ссылки на контекст, в котором происходит вызов функции setTimeout, поскольку setTimeout выполняет функцию, в которой this указывает на глобальный объект:

var that = this;
if (this.options.destroyOnHide) {
     setTimeout(function(){ that.tip.destroy() }, 1000);
} 

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

if (this.options.destroyOnHide) {
     setTimeout(function(){ this.tip.destroy() }.bind(this), 1000);
}

Функция bind создает новую функцию с предварительно заполненным значением этого значения.

Теперь в современном JS, это именно та функция стрелки проблемы, которая решается в ES6:

if (this.options.destroyOnHide) {
     setTimeout(() => { this.tip.destroy() }, 1000);
}

Функции стрелки не имеют собственного значения этого , когда вы обращаетесь к ней, вы получаете доступ к этому значению закрывающей лексической области видимости.

HTML5 также стандартизированные таймеры еще в 2011 году, и теперь вы можете передавать аргументы в функцию обратного вызова:

if (this.options.destroyOnHide) {
     setTimeout(function(that){ that.tip.destroy() }, 1000, this);
}

Смотрите также:

308
ответ дан 23 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: