0

JSを学ぶだけです。私の考えでは、関数 setTimeout コード領域は通常どおりに機能するはずですが、そうではありません。

var result = 0;
(function (i){
if(i > 0){
    result = result + i;
    i = i - 1;
    setTimeout("arguments.callee(" + i + ")",100);//arguments.callee(i);
}
else if(i == 0)
    return;
}(10));
alert(result);

setTimeout を削除すると、10 ではなく 55 のアラートが表示されます。理由を知っている人はいますか?

4

3 に答える 3

0

setTimeout非同期であるため、簡単に言えば、後で実行するようにスケジュールされていることを意味します。JS はそれを待たず (その行でコードを停止しません)、代わりに後続のコードを実行します。

そのため、後で設定すると、コードは「タイムアウト ループ」の外に出てアラートに入ります。この間、ループは 1 サイクルresultだけ実行され、10 だけ追加されました。

できること:

于 2013-10-28T03:39:31.033 に答える
0

試す

var result = 0;
(function (i, callback) {
    if (i > 0) {
        result = result + i;
        i = i - 1;
        var callee = arguments.callee;
        setTimeout(function () {
            callee(i, callback)
        }, 100);
    } else if (i == 0) {
        callback();
    }
}(10, function () {
    alert(result);
}));

デモ:フィドル

なんで?
あなたのアプローチには複数の問題があります

  1. setTimeout は非同期であるため、追加操作が完了する前にアラートがトリガーされます。解決策は、上記のように、追加が完了すると実行されるコールバック メソッドを使用することです。
  2. に文字列を渡すsetTimeoutと、グローバル スコープで実行されます。つまり、arguments.calleeは予想とは異なるオブジェクトを参照します。
于 2013-10-28T03:40:50.913 に答える