Considérez le code JavaScript suivant:
var a = []; var f = function() { for (var i = 0; i < 3; i++) { a.push(function(){alert(i)}); } for (var j = 0; j < 3; j++) { a[j](); } };
5 Réponses :
Créer une fonction anonyme qui accepte ou faire quelque chose de similaire: créer une fonction anonyme qui accepte i code> comme paramètre et renvoie que certaines fonction:
i code> comme paramètre pour ajouter la fonction au tableau: p>
Pas que c'est nécessaire, mais je pense qu'il a l'air plus propre et décrit vos intentions mieux pour envelopper vos fonctions "immédiatement exécutées" dans () code> ->
(fonction (i) {...} ) (i); code>
@gnarf, je débattais que moi-même. Je suppose que cela rend l'intention plus claire. Je vais éditer cela dans.
Cela semble à côté du problème initial en proposant une solution alternative qui n'est pas susceptible aux mêmes défauts sous-jacents ... Ce que vous faites ici consiste à appuyer sur une matrice. L'affiche originale pousse les fonctions qui, nous présumonsons, doivent être exécutées à quelques heures plus tard ...
Désolé, j'ai commenté trop vite. Vous avez raison. S'il vous plaît voir également ma réponse pour une solution comparable au même problème.
@funka - Vous appuyez toujours sur les fonctions: Création du (fonction (i) { code> scopes La variable
i code> pour rester tout ce que la fonction est appelée. avec
} ) (i); code> vous appelez immédiatement cette nouvelle fonction avec
i code> comme paramètre, qui renvoie une fonction ... stockage efficacement
[fonction () {alerte (0) {alerte (0) {alerte (0) ;}, fonction () {alerte (1);}, fonction () {aler t (2);}] code> dans
A code>
Oui, j'ai vu cela juste après avoir posté le commentaire. Nos deux réponses sont de nouvelles variables pour contenir l'itération actuelle de i code>, qui résolvent tous deux le même problème sous-jacent.
var iterate = (function () { var i, j = []; for (i = 0; i < 3; i += 1) { j.push(i); alert(j[j.length - 1]); } }()); You don't need closure to merely output a value. Your code should, however, be contained in a function for object-oriented containment. Functions don't have to be called to be executed.
"Les fonctions ne doivent pas être appelées à être exécutées." Quoi? Cette déclaration n'est pas très claire et, comme cela, cela semble faux. Clarifiez, s'il vous plaît?
Afin d'exécuter une fonction, l'une des trois choses doit arriver. 1) La fonction doit être appelée par nom par quelque chose d'autre qui exécute. 2) La fonction peut être insérée dans une méthode, auquel cas la fonction peut être anonyme et toujours être exécutée. Je m'oppose fortement à utiliser des fonctions sans leur donner un nom. 3) Les fonctions peuvent exécuter entièrement elles-mêmes comme elles sont interprétées si elles sont terminées avec une parenthèse après leur support de fermeture, telle que} (). Cela s'appelle une évocation immédiate.
Je ne suis pas d'accord. Une fonction est un type de valeur, juste comme 42 code> ou
'Hello World' code>, dans JavaScript. Que ce soit ou non, il est affecté à une variable ou utilisé signifie directement rien de spécial. Pour un exemple de ce comportement, exécutez:
(fonction (i) {var func = arguments.callee; if (! I) retour; console.log ('x'); fenêtre.settimeout (Fonction () {FUNC (I - 1);}, 1000);}) (4); code>
@Austin: Je ne pouvais plus en désaccord avec la déclaration "Je m'oppose fortement à utiliser des fonctions sans leur donner un nom" - Les fonctions anonymes sont l'un des outils les plus utiles du répertoire de Ninja JavaScript.
Il y a des avantages pour toujours nommer vos fonctions. 1) Une fonction anonyme fait exactement la même chose que la fonction d'invocation immédiate, à l'exception de celle qui peut être utilisée dans quelques endroits. 2) Une fonction nommée rend l'écriture de la documentation de manière significative et plus de détails. 3) Les fonctions nommées fournissent un lieu de connaissances pour les tests de l'unité où certains emplacements ne savent pas de manière unique lorsque vous utilisez des fonctions anonymes. En conséquence, il existe des avantages significatifs pour toujours nommer des fonctions et aucun avantage de ne pas nommer les fonctions.
@strager Non, une fonction n'est pas une valeur c'est un objet. Les objets ont des valeurs telles que les tableaux, les variables et l'hôte d'autres concepts. Cela ne signifie pas qu'un objet est la même chose qu'une valeur simplement parce qu'une valeur est contenue.
@cheney, 42 code>,
'Hello World' code>,
{} code>,
nouveau tableau () code> et
et fonction () {} code> sont toutes des expressions qui évaluent à une valeur.
@strager Ceux-ci peuvent évaluer à une valeur, mais cela ne signifie pas qu'ils sont des valeurs. Effectuez un type de () sur une fonction et il produira «fonction», ce qui n'est pas un type de valeur. Vous voudrez peut-être repousser des types JavaScript. Mozilla.org/js/language/js20-2000- 07 / Bibliothèques / types.html
@cheney, je trouve que c'est drôle que le lien que vous avez donné dans votre dernier commentaire soutient mon argument.
@trager Votre heuristique ou un simple manque de spécificité indique que vous n'avez rien crédible pour justifier la subjectivité du point. Je vous ai donné le lien pour illustrer que, dans les fonctions JavaScript, ont leur propre type, de même que les valeurs que vous revendiquez une fonction. Si je suis erroné, veuillez indiquer comment, au lieu d'inspirer le travail de conjecture et une convolution non sensibles. Je vous suggère de relâcher les types JavaScript et la fonction de typeOf car vous ne semblez pas comprendre comment JavaScript fonctionne comme une langue.
fonction (i) {alerte (i) p>
Plus que probablement, i code> sera indéfini.
+1 pour la terrasse. Cela fonctionnera si A.Push (fonction (i) {alerte (i)}); est utilisé à la place de A.Push (fonction () {alerte (i)});
Vous pouvez mettre le corps de votre boucle dans une fonction anonyme: en créant cette fonction et en passant la valeur de la boucle de "I" comme argument, nous créons une nouvelle " i "variable à l'intérieur du corps de la boucle qui cache essentiellement l'extérieur" I ". La fermeture que vous appuyez sur la matrice considère maintenant la nouvelle variable, dont la valeur est définie lorsque la fonction de fonction extérieure est appelée dans la première boucle. Cela pourrait être plus clair si nous utilisons un nom différent lorsque nous créons la nouvelle variable ... Cela fait la même chose: p> la valeur de "inew" est attribué 0, Puis 1, puis 2 parce que la fonction est appelée immédiatement par la boucle. p> p>
JUST pour ajouter ceci est à cause de JavaScript n'a aucun concept de blocage de blocage uniquement de la fonction de fonction, cela m'a jeté aussi ... Mattfreeman.co.uk/2010/03/clusures-Scope-in-javascript-vs-c