¿Cómo paso el contexto setTimeout
? Quiero llamar this.tip.destroy()
si this.options.destroyOnHide
después de 1000 ms. ¿Cómo puedo hacer eso?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
Cuando intento lo anterior, se this
refiere a la ventana.
javascript
callback
this
settimeout
JamesBrownIsDead
fuente
fuente
Respuestas:
EDITAR: En resumen, en 2010, cuando se hizo esta pregunta, la forma más común de resolver este problema era guardar una referencia al contexto donde se realiza la
setTimeout
llamada a la función, porquesetTimeout
ejecuta la funciónthis
apuntando al objeto global:En la especificación ES5, recién lanzada un año antes de ese momento, introdujo el
bind
método , esto no se sugirió en la respuesta original porque aún no era ampliamente compatible y necesitabas polyfills para usarlo, pero ahora está en todas partes:La
bind
función crea una nueva función con elthis
valor precargado.Ahora en JS moderno, este es exactamente el problema que las funciones de flecha resuelven en ES6 :
Las funciones de flecha no tienen un
this
valor propio, cuando accede a él, está accediendo althis
valor del ámbito léxico adjunto.HTML5 también estandarizó los temporizadores en 2011, y ahora puede pasar argumentos a la función de devolución de llamada:
Ver también:
fuente
this
a la función, habría resuelto este problema para este caso, para map (), forEach (), etc., etc., utilizando menos código, menos ciclos de CPU y menos memoria. *** Ver: la respuesta de Misha Reyzlin.Hay atajos ya preparados (azúcar sintáctico) para el contenedor de funciones con el que respondió @CMS. (A continuación, suponiendo que el contexto que desea es
this.tip
).ECMAScript 5 ( navegadores actuales , Node.js) y Prototype.js
Si apunta a un navegador compatible con ECMA-262, 5a edición (ECMAScript 5) o Node.js , puede usarlo
Function.prototype.bind
. Opcionalmente, puede pasar cualquier argumento de función para crear funciones parciales .Nuevamente, en su caso, intente esto:
La misma funcionalidad también se ha implementado en Prototype (¿alguna otra biblioteca?).
Function.prototype.bind
puede implementarse de esta manera si desea compatibilidad con versiones anteriores personalizadas (pero tenga en cuenta las notas).ECMAScript 2015 ( algunos navegadores , Node.js 5.0.0+)
Para el desarrollo de vanguardia (2015) puede utilizar las funciones de flecha gruesa , que forman parte de la especificación ( ejemplos ) ECMAScript 2015 (Harmony / ES6 / ES2015 ).
En su caso, intente esto:
jQuery
Si ya está utilizando jQuery 1.4+, hay una función lista para configurar explícitamente el
this
contexto de una función.En su caso, intente esto:
Underscore.js , lodash
Está disponible en Underscore.js, así como lodash, como
_.bind(...)
1 , 2En su caso, intente esto:
enlazar jquery underscore.js ecmascript-5 prototypejs node.js
fuente
func.bind(context...)
? ¿Echo de menos algo?var boundFn = fn.bind(this); boundFn(); boundFn();
por ejemplo.En navegadores que no sean Internet Explorer, puede pasar parámetros a la función juntos después del retraso:
Entonces, puedes hacer esto:
Esto es mejor en términos de rendimiento que una búsqueda de alcance (almacenamiento
this
en caché en una variable fuera del tiempo de espera / expresión de intervalo), y luego crear un cierre (mediante el uso de$.proxy
oFunction.prototype.bind
).El código para hacerlo funcionar en IE de Webreflection :
fuente
NOTA: Esto no funcionará en IE
fuente
Si está usando
underscore
, puede usarbind
.P.ej
fuente