2

このプログラムを実行しようとすると、Firefox で次のようなエラーが表示されます。

moveDate は 41 行目で定義されていません

(行を参照してwindow.setTimeout("moveDate()",100);ください。

理由はありますか?再帰関数は自分自身を定義してから自分自身を呼び出すことができると思いました。

function monthScroller(){
    document.getElementById("month").style.visibility = "visible";
    var x = 0;
    var y = 0;
    var dest_x = window.innerWidth/2;
    var dest_y = window.innerHeight/2;  
    var interval = 1;

    function moveDate() {
        if(x<dest_x){ x = x + interval;} 
        if(y<dest_y){ y = y + interval;}

        document.getElementById("month").style.top  = y+"px";
        document.getElementById("month").style.left = x+"px";

        if ((x+interval < dest_x) && (y+interval < dest_y)) {
                window.setTimeout("moveDate()",100);
        }
        else{
            name();
        }
    }
    moveDate();
}
4

2 に答える 2

6

はい、そうです。それでも、グローバルスコープでそのコード文字列window.setTimeout("moveDate()",100);を評価します-そこには見つかりません。代わりに、関数参照を:に渡します。moveDatesetTimout()

 window.setTimeout(moveDate, 100);
于 2012-05-30T03:54:01.423 に答える
2

「moveDate」は、monthScrollerメソッド内のスコープです。monthScroller関数の角かっこ以外のものは、「moveDate」関数を見ることができません。したがって...setTimeoutが実行されると、スコープ「window」とwindowには、スコープ内に「moveDate」という名前の関数がありません。あなたがする必要があるのは、呼び出しを次のように変更することです。

setTimeout(moveDate,100);

それはあなたのために働くはずです。このようにして、moveDate関数/オブジェクトをsetTimeoutに渡します。

于 2012-05-30T03:55:19.457 に答える