Как передать контекст в setTimeout
? Я хочу позвонить, this.tip.destroy()
если this.options.destroyOnHide
после 1000 мс. Как я могу это сделать?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
Когда я пытаюсь выше, this
относится к окну.
javascript
callback
this
settimeout
JamesBrownIsDead
источник
источник
Ответы:
РЕДАКТИРОВАТЬ: Подводя итог, еще в 2010 году, когда этот вопрос был задан, наиболее распространенным способом решения этой проблемы было сохранение ссылки на контекст, в котором
setTimeout
выполняется вызов функции, потому чтоsetTimeout
выполняет функцию сthis
указанием на глобальный объект:В спецификации ES5, выпущенной за год до этого, в нем был представлен
bind
метод , который не был предложен в первоначальном ответе, потому что он еще не получил широкой поддержки, и для его использования требовались полифилы, но теперь он вездеbind
Функция создает новую функцию сthis
значением предварительно заполненным.Теперь в современном JS именно эту проблему решают функции стрелок в ES6 :
Функции стрелок не имеют собственного
this
значения, когда вы обращаетесь к нему, вы получаете доступ кthis
значению лексической области видимости.HTML5 также стандартизировал таймеры еще в 2011 году, и теперь вы можете передавать аргументы в функцию обратного вызова:
Смотрите также:
источник
this
функцию, вы бы решили эту проблему для этого случая, для map (), forEach () и т. д., и т. д., используя меньше кода, меньше циклов ЦП и меньше памяти. *** Смотрите: ответ Миши Рейзлина.Есть готовые ярлыки (синтаксический сахар) для функции-обёртки @CMS, с которой ответили. (Ниже предполагается, что контекст, который вы хотите, есть
this.tip
.)ECMAScript 5 ( текущие браузеры , Node.js) и Prototype.js
Если вы используете браузер, совместимый с ECMA-262, 5-е издание (ECMAScript 5) или Node.js , вы можете использовать его
Function.prototype.bind
. При желании вы можете передать любые аргументы функции для создания частичных функций .Опять же, в вашем случае попробуйте это:
Та же функциональность также была реализована в Prototype (какие-либо другие библиотеки?).
Function.prototype.bind
может быть реализовано следующим образом, если вы хотите обратную совместимость (но, пожалуйста, обратите внимание на примечания).ECMAScript 2015 ( некоторые браузеры , Node.js 5.0.0+)
Для передовых разработок (2015) вы можете использовать функции жирной стрелки , которые являются частью спецификации ECMAScript 2015 (Harmony / ES6 / ES2015) ( примеры ).
В вашем случае попробуйте это:
JQuery
Если вы уже используете jQuery 1.4+, есть готовая функция для явного задания
this
контекста функции.В вашем случае попробуйте это:
Underscore.js , lodash
Он доступен в Underscore.js, а также в lodash, как
_.bind(...)
1 , 2В вашем случае попробуйте это:
привязывать JQuery underscore.js ECMAScript-5 prototypejs Node.js
источник
func.bind(context...)
? Я что-то пропустил?var boundFn = fn.bind(this); boundFn(); boundFn();
например.В браузерах, отличных от Internet Explorer, вы можете передавать параметры в функцию вместе после задержки:
Итак, вы можете сделать это:
Это лучше с точки зрения производительности, чем поиск по области (кэширование
this
в переменную вне выражения тайм-аута / интервала), а затем создание замыкания (с помощью$.proxy
илиFunction.prototype.bind
).Код, чтобы заставить его работать в IE от Webreflection :
источник
ПРИМЕЧАНИЕ: это не будет работать в IE
источник
Если вы используете
underscore
, вы можете использоватьbind
.Например
источник