2010-07-02 4 views
2

J'ai cette fonction:attacher avec le paramètre de javascript

function addButtonLookup() { 

    var element = document.getElementById("btnToolBar"); 
    var index; 
    for (var i = 0; i < lookupArray.length; i++) { 

     index = i; 

     var btn = document.createElement('input'); 
     btn.type = 'button'; 
     btn.value = '' + lookupArray[i]; 
     btn.name = 'btnLookup' + i; 
     btn.id = i; 
     btn.className = 'CommonButtonStyle'; 
     element.appendChild(btn); 
     btn.onclick = function() { 
      debugger; 

      tblExcpression.WriteMathElement(lookupArray[i], lookupArray[i]); 
     }; 


    } 

} 

onbutton cliquez sur le i est définie

+0

Erreur typique. Voir [Fermetures JavaScript pour les nuls] (http://blog.morrisjohns.com/javascript_closures_for_dummies.html), Exemple 5. –

Répondre

2

Au lieu de cela:

btn.onclick = function() { 
    debugger; 

    tblExcpression.WriteMathElement(lookupArray[i], lookupArray[i]); 
}; 

Essayez ceci:

btn.onclick = (function(i) { 
    return function() { 
     debugger; 
     tblExcpression.WriteMathElement(lookupArray[i], lookupArray[i]); 
    } 
})(i); 

Le problème avec le La première version est que la variable i est copiée de la portée actuelle. Cependant, la variable i varie dans la portée actuelle (cela fait partie d'une boucle for), c'est pourquoi vous obtenez ce comportement bizarre.

En faisant passer la i variable en paremeter une nouvelle fonction (comme le deuxième exemple), le courant i variable est copiée.

Vous devriez jeter un coup d'œil sur le fonctionnement de Closures en JavaScript.

Questions connexes