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);
}
Смотрите также: