2

重複の可能性:
forループでsetTimeoutを実行し、iを値として渡します

動的配列を生成し、この配列をループとして使用しようとしていますが、ループ内でsettime outが機能していないか、関数が機能していません。これが私のコードです

jQuery(document).ready(function () {
    temp = new Array();
    generateArray(temp);

    function generateArray(temp) {
        if (temp.length < 10) {
            res = randomXToY(1, 10, 0);
            for (var k = 0; k < temp.length; k++) {
                if (temp[k] == res) {
                    var test = 1;
                }
            }
            if (test != 1) {
                temp.push(res);
                //abc(temp);
            }
            generateArray(temp);
        } else {
            for (var z = 0; z < 10; z++) {
                tnest(temp[z]);
                setTimeout(function () {
                    removeClassImg(temp[z])
                }, 3000);
            }
            temp = new Array();
            generateArray(temp);
        }
    }

    function removeClassImg(result1) {
        alert(result1);
        $('#img' + result1).fadeTo(12000, 0.1);
        return true;
    }

    function tnest(result) {
        alert(result);
        $('#img' + result).fadeTo(12000, 1);
        return true;
    }

    function randomXToY(minVal, maxVal, floatVal) {
        var randVal = minVal + (Math.random() * (maxVal - minVal));
        return typeof floatVal == 'undefined' ? Math.round(randVal) : randVal.toFixed(floatVal);
    }
});

関数removeClassImgのアラートが機能していません..forループでsettimeoutを使用していますが、これは正常に機能していません。

4

2 に答える 2

4

それはタイムアウトとループと関係があります。zタイムアウトコールバックが「その時点で」の値にバインドされるように、クロージャでラップする必要があります。

ループの後でこれにも気づきます:

temp = new Array();
generateArray(temp);

遅延操作を操作したいときまでに、配列には必要な値が含まれていません。あなたはすでにそれらをクリアしました。

これを試して:

for (var z = 0; z < 10; z++) {
    (function (tz) {                  //"localize" temp[z] by creating a scope
        tnest(tz);                    //that makes temp[z] local. this is done
        setTimeout(function () {      //by creating an immediate function
            removeClassImg(tz)        //passing temp[z] into it. that way, the 
        }, 3000);                     //timeout receives a local temp[z] which
    }(temp[z]));                      //has the value of temp[z] "at that time"
}

これは、クロージャーのあるサンプルとクロージャーのないサンプルです。3秒後、それがないものは0-10ではなくすべての10をログに記録することがわかります。

于 2012-05-24T08:27:29.213 に答える
2

zこれは、で設定した関数の変数にアクセスしsetTimeoutてクロージャを作成zし、ループで使用されているためです。つまり、関数を呼び出すときzと等しい結果になる可能性があります。10setTimeout

この問題と考えられる解決策については、ここですでに説明しました:変数をsetTimeout関数に渡す方法は?私はそれがあなたを助けると思います!

于 2012-05-24T08:29:31.967 に答える