1

それは私にとって本当に問題ではありません。回避策ではなく、正しく行う方法を知りたいだけです。for()といくつかの遅延イベントを使用すると、最後の値のみが考慮されます。

テスト: http://jsfiddle.net/39dQV/

// Using only i (does not work)
for(var i=0; i<10; i++) {
    setTimeout(function() {
        test1.textContent = i;
    }, i * 1000);
}

// Private scope to i (does not work either)
for(var i=0; i<10; i++) {
    var x = i;

    setTimeout(function() {
        test2.textContent = x;
    }, i * 1000);
}

// Callback scope (workaround)
function set_textContent(i) {
    setTimeout(function() {
        test3.textContent = i;
    }, i * 1000);
};

for(var i=0; i<10; i++) {
    set_textContent(i);
}​

正しく動作するようにするには、何をする必要がありますiか?

4

1 に答える 1

2

あなたの解決策は実際には「回避策」ではなく、最良の方法の近くにあります。

for(var i=0; i<10; i++) {
    setTimeout(function() {
        test1.textContent = i;
    }, i * 1000);
}

働けない!iはローカルスコープにあり、関数の実行時に定義されなくなりました。

for(var i=0; i<10; i++) {
    var x = i;

    setTimeout(function() {
        test2.textContent = x;
    }, i * 1000);
}

ここでも同じ状況で、xはループ内でローカルです。

変数には独自のスコープが必要です。このようなスコープを定義する唯一の方法は、3番目の方法で行ったように、タイムアウト関数の定義をクロージャまたは関数内にカプセル化することです。

私はそれをそう書くでしょう:

for(var i=0; i<10; i++) {
    ( function( i ) {
        setTimeout(function() {
            test1.textContent = i;
        }, i * 1000);
    } ( i ) };
}

クロージャは独自のスコープを定義するため、iの値が格納されます。

詳細については、http ://www.javascriptenlightenment.com/を参照してください(大好きです)

于 2012-10-26T21:11:40.980 に答える