Comment kick-ass passer portée par “setInterval”
Je suis en train de se demander s'il existe une meilleure solution que de passer ce champ d'application de la lambda-fonction via le paramètre 'e', puis en le passant à "funkyFunction' l'aide de call()-méthode
setInterval(function(e){e.funkyFunction.call(e)}, speed, this)
(Petite question à part: j'avais lu quelque chose à propos de la mémoire des fuites en javascript. Comment le lambda-fonction de nuire à ma mémoire? Est-il préférable de la définir d'abord comme var i = function(e)...
, puis en le passant en paramètre à la fonction setInterval?)
OriginalL'auteur PenthousePauper | 2010-08-15
Vous devez vous connecter pour publier un commentaire.
Quel est le problème avec tout simplement en s'appuyant sur l'extérieure de la portée de la variable définie par l'?
Avoir une référence à l'objet dans une clôture ne causera pas de problèmes de mémoire. En passant
this
àsetInterval
de garder l'objet vivant de toute façon. C'est aussi Firefox spécifiques, de sorte qu'il ne fonctionne pas partout.Comment est-il FF spécifique?
Cette réponse est très bien; la FF-partie spécifique est le passage d'un paramètre à la fonction de rappel, comme dans la question.
OK je comprends, merci pour la clarification.
OriginalL'auteur meder omuraliev
Que ma situation était un peu différente, mais voici ce que j'ai fait:
Mon scénario, c'est que mon code était à l'intérieur d'une méthode de classe et j'avais besoin de garder corriger portée que je ne voulais pas le " il " de la liaison à résoudre à la fenêtre en cours.
par exemple. Je voulais courir MyClass.animer de MyClass.init à l'aide de la méthode setInterval alors j'ai mis ce champ d'application,-garder le code en MyClass.init
OriginalL'auteur Jacksonkr
Vous pouvez utiliser natif de fonction de liaison.
coller cet exemple dans la console pour voir le résultat
OriginalL'auteur CORSAIR
J'ai eu la même question, mais il semble y avoir pas intégré dans la solution, voici donc une rapide solution de contournement que j'ai frappé ensemble:
utilisation:
Il ne concerne que les cas d'utilisation où l'on passe d'une fonction réelle, pas une chaîne de code à exécuter.
Comme pour votre question au sujet des fuites de mémoire lors de l'utilisation de cette fonctionnalité: il n'est pas tellement le problème de l'utilisation de
setInterval
que c'est avec des fonctions anonymes en lui-même.Si vous utilisez une référence à un objet à l'intérieur d'un lambda, cette référence permettra de garder l'objet référencé dans la mémoire tant que la fonction anonyme existe. Je pense que la fonction est de les détruire avec un appel à
clearInterval
.Je ne pense pas qu'il y est un quelconque avantage de l'affectation de la fonction à une variable de la première, au contraire, il va créer une autre variable contenant une référence qui ne seront pas nettoyés aussi longtemps que les anon func existe...
setScopedInterval(function () {this.myFunc();}, 1000, this)
sursetInterval(function (x) {x.myFunc();}, 1000, this)
. Que diriez -var setScopedInterval = (f, time, scope, ...p) => setInterval((x, p) => x.f(...p), time, scope, p);
à la place? Exemple d'utilisation:setScopedInterval(this.myFunc, 1000, this, p1, p2, p3)
.en 2013, alors que cette réponse a été posté, flèche de fonction ne sont pas encore implémenté en javascript, c'est toute la question de la question d'origine. La différence entre les fonctions anonymes et flèche fonctions est portée à l'héritage.
J'avais peur que ma notation moderne serait de vous distraire de la bonne question... et il l'a fait. Mais, il oublie, il y a novice au niveau des erreurs dans mon code:
x.f(...p)
au lieu dex[f](...p)
au lieu def.apply(x, p)
. De la même manière:x.myFunc()
au lieu dex[myFunc]()
au lieu demyFunc.apply(x)
. La fixation de leur tourne mes solutions dans vos solutions et essentiellement répond à ma propre question.Il existe encore d'autres questions: 1. Pourquoi
setScopedInterval(function () { this.myFunc(); }, 1000, this);
plutôt quesetScopedInterval(this.myFunc, 1000, this);
? 2. Pourquoi ne pas natifsetInterval(this.myFunc.bind(this), 1000);
à la place? Il n'y avait pasbind
méthode en 2013? 3. Pourquoi ne pas saisir cette opportunité et de permettresetScopedInterval
également passer des arguments? De retour en 2013, le natif desetInterval
ne permettaient pas le passage d'arguments à la fonction d'intervalle et votre fonction pourrait la mettre en œuvre avec un minimum de code. Comme ceci:func.apply(scope, arguments)
.OriginalL'auteur NDM
Vous pouvez également jeter un oeil à la
YUI
Framework
. C'est bien pour les applications du bâtiment et facile à apprendre.Mise à JOUR comme exemple
À l'aide de YUI et jQuery (Ne pas oublier d'activer $.noConflict())
En bref
voir http://yuilibrary.com/yui/docs/api/classes/YUI.html#method_later
Mise à JOUR
Pas besoin de $.noConflict() car YUI ne pas utiliser $ en aucune façon.
OriginalL'auteur PapaKai
Il y a deux distinctions importantes à faire.
1) voulez-vous une référence à l'passées en paramètre de sorte que la fonction d'expiration pouvez suivre les modifications apportées, ou voulez-vous un clone de l'passées en paramètre?
2) voulez-vous être en mesure de capturer une référence pour le délai d'attente dans le cas où vous souhaitez l'annuler? (Oui!)
OriginalL'auteur Tyler V.