Javascript: "Gebundene" Variablen



  • Hey,

    ich hab in Javascript ungefähr folgendes Snippet. Es gibt jedem Objekt in einer Liste eine Funktion, die mit dem Index des Objekts arbeitet:

    var list = [ ... ];
    
    function foo() {
        for ( var idx in list ) {
            var item = list[idx];
            item.someFunc = function() { alert(idx); };
        }
    }
    

    Problem: Bei Aufruf der Funktion arbeitet sie immer mit dem letzten Index. Bei der Funktionsdefinition wird anscheinend eine Referenz auf die "idx"-Variable übergeben. Ich will aber mit dem "richtigen" Wert von "idx" zu diesem Zeitpunkt arbeiten.

    Unschöner Workaround:

    function createMyFunction( index ) {
        return function() { alert(index); };
    }
    
    ...
            item.someFunc = createMyFunction(idx);
    

    Kennt jemand einen vernünftigen Weg ohne den Workaround?



  • fdfdg schrieb:

    Problem: Bei Aufruf der Funktion arbeitet sie immer mit dem letzten Index.

    Also beim Aufruf von item.someFunc() wird bei jedem Objekt der Liste der allerletzte Index 'alert'et, nicht der passende.



  • function() { alert(idx)} ist eine Clojure. idx ist im outer scope deklariert und hat nach ablauf der schleife den letzten wert.

    versuchs mal mit:

    function() { var local = idx; alert(local)}



  • item.someFunc = function(idx) { return function(){ alert(idx);}}(idx);

    idx wird gecaptured aber nicht kopiert. Deshalb musst du es neu scopen.



  • roflalter was hab ich da geschrieben



  • Perfekt, ich danke euch beiden!

    Shades Variante funktioniert.


Anmelden zum Antworten