2010-03-16 2 views
3

Je ne sais pas exactement comment décrire ce que je veux. Je veux définir une fonction avec les paramètres étant une valeur locale et non une référence.Création d'une référence de fonction qui a des paramètres de valeur et non des références

dire que j'ai liste des objets que je veux créer

for(i = 0; i < 10; i++){ 
    var div = document.createElement("div"); 
    div.onclick = function(){alert(i);}; 
    document.appendChild(div); 
} 

Maintenant, je crois, dans cet exemple, peu importe ce que div je clique dessus, il alerte « 10 »; comme c'est la dernière valeur de la variable i;

Est-il possible/comment puis-je créer une fonction avec les paramètres étant la valeur qu'ils sont au moment où je précise la fonction ... si cela a du sens.

+1

Dans la fonction, 'I' est une variable capturée, pas un paramètre. – SLaks

+0

Voir aussi: http://stackoverflow.com/questions/1734749/ http://stackoverflow.com/questions/643542/ http://stackoverflow.com/questions/1582634/ http://stackoverflow.com/questions/1331769/ http://stackoverflow.com/questions/1552941/ http://stackoverflow.com/questions/750486/ http://stackoverflow.com/questions/933343/ http://stackoverflow.com/questions/1579978/ http://stackoverflow.com/questions/1413916/ ... et plus ... :) – CMS

+0

@CMS: Oui; J'ai eu beaucoup de réputation pour répondre à ce genre de question. – SLaks

Répondre

5

Vous devez créer la fonction dans une autre fonction.

Par exemple:

div.onclick = (function(innerI) { 
    return function() { alert(innerI); } 
})(i); 

Ce code crée une fonction qui prend un paramètre et retourne une fonction qui utilise le paramètre. Puisque le paramètre à la fonction externe est passé par la valeur, il résout votre problème.

Il est généralement plus claire pour rendre la fonction extérieure une fonction séparée, du nom, comme celui-ci:

function buildClickHandler(i) { 
    return function() { alert(i); }; 
} 

for(i = 0; i < 10; i++){ 
    var div = document.createElement("div"); 
    div.onclick = buildClickHandler(i); 
    document.appendChild(div); 
} 
+1

+1 pour hyper-rapidité et correction! – Anurag

+0

Maintenant je suppose que je dois curry les fonctions si je veux passer 'ceci' aussi? div.onclick = function() {somefunction (i, this)}; –

+0

@Sheldon: Correct. Alternativement, 'someFunc.call (this, i)' vous permettra d'utiliser 'this' à l'intérieur de' someFunc'. – SLaks

0

Vous pouvez utiliser une fonction anonyme:

for(i = 0; i < 10; i++){ 
    (function(i){ 
     var div = document.createElement("div"); 
     div.onclick = function(){alert(i);}; 
     document.appendChild(div); 
    })(i) 
} 
Questions connexes