2

次のスクリプトは 1 2 3 4 5 6 7 を出力します。0 1 2 3 4 5 ... を出力すると仮定します。

実際、私の実際のコードでは、 print(lostCnt) は常に最新の (グローバルのように動作する) 最後のカウント更新に接続されていると思います。どうしてこれなの?そして、obj1のコードを変更できないという制約で実際のcntを保持するにはどうすればよいですか。

<!DOCTYPE html>

<html>
<head>
<script type="text/javascript">
function obj1(parameter, callback){
    setTimeout(callback, parameter);
}
function caller(){
    function miscFunction(cnt){
        document.getElementById("main").appendChild(document.createTextNode(cnt));
    }
    var lostCnt = 0;
    setInterval(
        function(){
            new obj1(5, 
                function(){
                    miscFunction(lostCnt);
                });
           lostCnt++;
        },5000
    );
}   
</script>


</head>
<body onload="caller();">
<div id="main">
</div>
</body>

</html>

ありがとう、そしてこれが私の最初の投稿です

4

1 に答える 1

1

lostCnt++は、 への最初の呼び出しの前に実行されますmiscFunction()

obj1コンストラクターは、構築後 5 ミリ秒まで数値を表示しません。コールバックが呼び出されるのはその時点だけであり、コールバックはlostCnt直接参照しobj1ます。インスタンスが作成されたときの保存されたコピーではありません。

したがって、あなたの仮定は正しいです。obj1コンストラクターに渡されたコールバックlostCnt直接参照していることは明らかです。

別の方法で実行したい場合は、次のようにします。

setInterval(
    function(){
        new obj1(5, 
          function(savedLostCnt) {
            return function(){
                miscFunction(savedLostCnt);
            };
          }(lostCnt));
        lostCnt++;
    },5000
);
于 2012-07-14T01:01:55.870 に答える