¿Cómo paso el contexto setTimeout? Quiero llamar this.tip.destroy()si this.options.destroyOnHidedespués de 1000 ms. ¿Cómo puedo hacer eso?
if (this.options.destroyOnHide) {
     setTimeout(function() { this.tip.destroy() }, 1000);
} Cuando intento lo anterior, se thisrefiere 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
setTimeoutllamada a la función, porquesetTimeoutejecuta la funciónthisapuntando al objeto global:En la especificación ES5, recién lanzada un año antes de ese momento, introdujo el
bindmé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
bindfunción crea una nueva función con elthisvalor 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
thisvalor propio, cuando accede a él, está accediendo althisvalor 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
thisa 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.bindpuede 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
thiscontexto 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
thisen caché en una variable fuera del tiempo de espera / expresión de intervalo), y luego crear un cierre (mediante el uso de$.proxyoFunction.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