Comment passer le contexte setTimeout
? Je veux appeler this.tip.destroy()
si this.options.destroyOnHide
après 1000 ms. Comment puis je faire ça?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
Lorsque j'essaie ce qui précède, se this
réfère à la fenêtre.
javascript
callback
this
settimeout
JamesBrownIsDead
la source
la source
Réponses:
EDIT: En résumé, en 2010, lorsque cette question a été posée, le moyen le plus courant de résoudre ce problème était d'enregistrer une référence au contexte dans lequel l'
setTimeout
appel de fonction est effectué, carsetTimeout
exécute la fonction enthis
pointant vers l'objet global:Dans la spécification ES5, juste publiée un an avant cette date, elle a introduit la
bind
méthode , ce qui n'était pas suggéré dans la réponse originale car elle n'était pas encore largement prise en charge et vous aviez besoin de polyfills pour l'utiliser, mais maintenant elle est partout:La
bind
fonction crée une nouvelle fonction avec lathis
valeur pré-remplie.Maintenant, dans JS moderne, c'est exactement le problème que posent les fonctions fléchées dans ES6 :
Les fonctions fléchées n'ont pas de
this
valeur propre, lorsque vous y accédez, vous accédez à lathis
valeur de la portée lexicale englobante.HTML5 a également normalisé les minuteries en 2011, et vous pouvez maintenant passer des arguments à la fonction de rappel:
Voir également:
la source
this
la fonction, vous auriez résolu ce problème dans ce cas, pour map (), forEach (), etc., etc., en utilisant moins de code, moins de cycles CPU et moins de mémoire. *** Voir: la réponse de Misha Reyzlin.Il existe des raccourcis prêts à l'emploi (sucre syntaxique) vers l'encapsuleur de fonction auquel @CMS a répondu. (Ci-dessous, en supposant que le contexte que vous souhaitez est
this.tip
.)ECMAScript 5 ( navigateurs actuels , Node.js) et Prototype.js
Si vous ciblez un navigateur compatible avec ECMA-262, 5e édition (ECMAScript 5) ou Node.js , vous pouvez utiliser
Function.prototype.bind
. Vous pouvez éventuellement passer n'importe quel argument de fonction pour créer des fonctions partielles .Encore une fois, dans votre cas, essayez ceci:
La même fonctionnalité a également été implémentée dans Prototype (toutes autres bibliothèques?).
Function.prototype.bind
peut être implémenté comme ceci si vous voulez une compatibilité descendante personnalisée (mais veuillez respecter les notes).ECMAScript 2015 ( certains navigateurs , Node.js 5.0.0+)
Pour un développement de pointe (2015), vous pouvez utiliser les fonctions de flèche grasse , qui font partie de la spécification ECMAScript 2015 (Harmony / ES6 / ES2015) ( exemples ).
Dans votre cas, essayez ceci:
jQuery
Si vous utilisez déjà jQuery 1.4+, il existe une fonction prête à l'emploi pour définir explicitement le
this
contexte d'une fonction.Dans votre cas, essayez ceci:
Underscore.js , lodash
Il est disponible dans Underscore.js, ainsi que lodash, comme
_.bind(...)
1 , 2Dans votre cas, essayez ceci:
lier jquery underscore.js ecmascript-5 prototypejs node.js
la source
func.bind(context...)
? Dois-je manquer quelque chose?var boundFn = fn.bind(this); boundFn(); boundFn();
par exemple.Dans les navigateurs autres qu'Internet Explorer, vous pouvez transmettre des paramètres à la fonction ensemble après le délai:
Donc, vous pouvez le faire:
C'est mieux en termes de performances qu'une recherche de portée (mise
this
en cache dans une variable en dehors de l'expression de délai d'expiration / intervalle), puis de créer une fermeture (en utilisant$.proxy
ouFunction.prototype.bind
).Le code pour le faire fonctionner dans les IE de Webreflection :
la source
REMARQUE: cela ne fonctionnera pas dans IE
la source
Si vous utilisez
underscore
, vous pouvez utiliserbind
.Par exemple
la source