2011-01-09 9 views
4

J'ai besoin de créer plusieurs fonctions javascript qui ont un id à l'intérieur, donc la fonction elle-même sait quelles données traiter.comment conserver la valeur d'une variable dans une fermeture

Voici un code:

(function(){ 
    function log(s){ 
    if(console && console.log) console.log(s); 
    else alert(s); 
    } 
    var i = 10; while (i--){ 
    window.setTimeout(function(){ 
     // i need i to be 10, 9, 8... here not -1 
     log(i); 
    },500); 
    } 
})(); 

Le problème vient du fait i AllWays est mise à jour par la boucle, et je dois éviter cela.

Merci d'avance pour toute aide, commentaires ou astuces!

Répondre

2

Un peu meilleure approche à l'aide d'une fonction appelée immédiatement à chaque itération, est d'avoir votre fonction log() retour d'une fonction.

(function(){ 
    function log(s){ 
    return function() { 
     if(console && console.log) console.log(s); 
     else alert(s); 
    }; 
    } 
    var i = 10; while (i--){ 
    window.setTimeout(log(i),500); 
    } 
})(); 

Le résultat global est que vous finissez par construire moins d'objets de fonction.

Si vous vouliez les appels d'être à un intervalle, utilisez setInterval(), ou changer ceci:

window.setTimeout(log(i), 500); 

à ceci:

window.setTimeout(log(i), i * 500); 
+0

Merci Patrick! –

+0

@Florian: De rien. – user113716

3

Créez simplement une fonction et appelez-la.

while (i--) { 
    (function(i) { 
     // use i here 
    })(i); 
} 
+0

Merci, mais je ne fonctionnera pas mon cas. la fonction sera appelée retardée. –

+0

@Florian Comment? setTimeout est exécuté _inside_, la fonction (i) 'est exécutée immédiatement. –

3
(function(){ 
    function log(s){ 
    if(console && console.log) console.log(s); 
    else alert(s); 
    } 
    var i = 10; while (i--){ 

    (function() { // start anon func 

     var copy = i; // copy loop variable 

     window.setTimeout(function(){ 
     log(copy); // refer to copy 
     },500); 

    })(); // end anon func and call it immediately 
    } 
})(); 
+1

Normalement vous passez la valeur à copier à la fonction anonyme comme un argument –

+0

Merci Daniel pour fournir un exemple supplémentaire, je pense que je comprends maintenant le concept! –

Questions connexes