2011-01-09 16 views
4

静的idを持つ複数のjavascript関数を作成する必要があります。そのため、関数自体は処理するデータを知っています。ここで クロージャー内の変数の値を保持する方法

はいくつかのコードです:私はオールウェイズループによって更新される こと

(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); 
    } 
})(); 

問題イスト、と私はこれを防ぐために必要です。

ご協力いただきありがとうございました。

答えて

2

各反復ですぐに呼び出される関数を使用することに少し良くアプローチは、あなたのlog()関数が機能を返すことです。

(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); 
    } 
})(); 

全体的な結果として、最終的にはより少ない関数オブジェクトが構築されます。

あなたは呼び出しがどちらか、間隔であることsetInterval()を使用するか、この変更したい場合:これまで

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

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

ありがとうパトリック! –

+0

@Florian:どうぞよろしくお願いいたします。 – user113716

3

関数を作成して呼び出すだけです。

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

おかげで、私は私の場合その文句を言わない仕事を。関数は遅延と呼ばれます。 –

+0

@Florianどのように? setTimeoutが実行されると、すぐに 'function(i)'が実行されます。 –

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

通常、引数として無名関数にコピーする値を渡します。 –

+0

追加の例を提供してくれてありがとうDanielありがとう、私は今考えていると思う! –

関連する問題