0

JavaScript はコードを上から下まで読み取ると言う前に、私はそれを知っているとだけ言っておきます。startBallEasy()そのため、 と呼ばれる関数とその下にある と呼ばれる別の関数を含むページがありますstopLoop()。これは基本的に次のとおりです。

var foo = 1;
var loop;

function startBallEasy() {
    if(foo==1) {
        alert("foo is 1!");
    } else {
        stopLoop();
    }

    loop = setTimeout("startBallEasy()",10);
}

function stopLoop() {
    clearTimeout(loop);
}

そのため、startBallEasy()ほとんどループします。一定の条件であれば、それ自体が停止します。しかし、まだ宣言されていないため、関数を見つけることができません。どうすればいいですか?

4

4 に答える 4

0

これを試して、

var loop=null;
function startBallEasy() {
    if(foo==1) {
        alert("foo is 1!");
    } else {
        clearTimeout(loop);
    }

    loop = setTimeout("startBallEasy()",10);
}
setTimeout("startBallEasy()",10);

like のsetInterval代わりに (再帰関数を使用したくない場合) を使用できます。setTimeout

var foo = 1;
var loop=null;
function startBallEasy() {
    if(foo==1) {
        alert("foo is 1!");
    } else {
        clearInterval(loop);
    }
}
loop = setInterval("startBallEasy()",10);
于 2013-05-27T04:23:19.203 に答える
0

渡す文字列または関数setTimeoutは、グローバル コンテキストで実行されます。

ここに投稿したコードがonLoadハンドラーなどでラップされている場合、これはstartBallEasyそのハンドラーに対してローカルであるため、グローバル スコープではアクセスできないことを意味します。投稿したコードがすべてである場合は、ここに示すように正常に動作するはずです(警告: コードには終了条件がないため、「foo is 1!」アラートのエンドレス ストリームが表示されます)。

startBallEasyminitech が述べたように、解決策は、依存関係 ( ) を閉じる関数を に渡すことsetTimeoutです。

var foo = 1;
var loop;

function startBallEasy() {
    if(foo==1) {
        alert("foo is 1!");
    } else {
        stopLoop();
    }

    loop = setTimeout(function(){startBallEasy();},10);
}

function stopLoop() {
    clearTimeout(loop);
}

現在、コードには終了条件がないことに注意してください。これは、0 から 9 までカウントし、foo各反復での状態をログに記録する、わずかに変更されたデモンストレーションです: http://jsfiddle.net/JWyzy/

于 2013-05-30T14:22:30.230 に答える