Como passo o contexto setTimeout
? Eu quero ligar this.tip.destroy()
se this.options.destroyOnHide
depois de 1000 ms. Como eu posso fazer isso?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
Quando tento o acima, this
refere-se à janela.
javascript
callback
this
settimeout
JamesBrownIsDead
fonte
fonte
Respostas:
EDIT: Em resumo, em 2010, quando essa pergunta foi feita, a maneira mais comum de resolver esse problema era salvar uma referência ao contexto em que a
setTimeout
chamada da função é feita, porquesetTimeout
executa a funçãothis
apontando para o objeto global:Na especificação do ES5, lançada um ano antes dessa época, ele introduziu o
bind
método , isso não foi sugerido na resposta original porque ainda não era amplamente suportado e você precisava de polyfills para usá-lo, mas agora está em toda parte:A
bind
função cria uma nova função com othis
valor pré-preenchido.Agora, no JS moderno, esse é exatamente o problema que as funções de seta resolvem no ES6 :
As funções de seta não têm um
this
valor próprio; quando você acessa, está acessando othis
valor do escopo lexical anexo.O HTML5 também padronizou os temporizadores em 2011 e agora você pode passar argumentos para a função de retorno de chamada:
Veja também:
fonte
this
para a função, teria resolvido esse problema nesse caso, para map (), forEach () etc., etc., usando menos código, menos ciclos de CPU e menos memória. *** Veja: resposta de Misha Reyzlin.Existem atalhos prontos (açúcar sintático) para o wrapper de função @CMS respondido. (Abaixo, assumindo que o contexto que você deseja é
this.tip
.)ECMAScript 5 ( navegadores atuais , Node.js) e Prototype.js
Se você segmentar um navegador compatível com ECMA-262, 5ª edição (ECMAScript 5) ou Node.js , poderá usar
Function.prototype.bind
. Opcionalmente, você pode transmitir qualquer argumento de função para criar funções parciais .Novamente, no seu caso, tente o seguinte:
A mesma funcionalidade também foi implementada no Prototype (outras bibliotecas?).
Function.prototype.bind
pode ser implementado assim se você desejar compatibilidade com versões anteriores personalizadas (mas observe as notas).ECMAScript 2015 ( alguns navegadores , Node.js 5.0.0+)
Para o desenvolvimento de ponta (2015), você pode usar as funções de seta gorda , que fazem parte da especificação do ECMAScript 2015 (Harmony / ES6 / ES2015) ( exemplos ).
No seu caso, tente o seguinte:
jQuery
Se você já usa o jQuery 1.4+, existe uma função pronta para definir explicitamente o
this
contexto de uma função.No seu caso, tente o seguinte:
Underscore.js , lodash
Está disponível no Underscore.js, bem como no lodash, como
_.bind(...)
1 , 2No seu caso, tente o seguinte:
ligar jquery underscore.js ecmascript-5 prototypejs node.js
fonte
func.bind(context...)
? Perco alguma coisa?var boundFn = fn.bind(this); boundFn(); boundFn();
por exemplo.Em navegadores que não sejam o Internet Explorer, você pode passar parâmetros para a função juntos após o atraso:
Então, você pode fazer isso:
Isso é melhor em termos de desempenho do que uma pesquisa de escopo (armazenamento
this
em cache em uma variável fora da expressão de tempo limite / intervalo) e, em seguida, criando um fechamento (usando$.proxy
ouFunction.prototype.bind
).O código para fazê-lo funcionar no IEs a partir de Webreflection :
fonte
NOTA: Isso não funcionará no IE
fonte
Se você estiver usando
underscore
, você pode usarbind
.Por exemplo
fonte