1

スコープの問題、私は関数ステートメントが常に現在のコンテキストの一番上に引き上げられていると思いました。では、なぜ'hideNav()'が次のように定義されていないのですか?

var t;


function showNav(bflag){
clearTimeout(t);
if(bflag===true){
    $("#tS2").stop(false,false).animate({
                'bottom':'0'
            }, 1000);
}else{

    t=setTimeout("hideNav()",1000);

}
}

function hideNav(){
$("#tS2").stop(true,false).animate({
                'bottom':'-125px'
            }, 1000);
}
4

2 に答える 2

6

変化する、

setTimeout("hideNav()",1000);

setTimeout(hideNav, 1000);

hideNavは現在のコンテキストでのみ定義されていますが、文字列をに渡していますsetTimeout。その文字列は、グローバルオブジェクトのコンテキストでタイムアウトが発生したときに評価されます。hideNav関数はグローバルオブジェクトで定義されていないため、例外がスローされます。

関数への参照をに直接渡すことで、setTimeout心配する必要はありません。

于 2012-04-14T01:54:28.453 に答える
2

この場合、で文字列を使用しないでくださいsetTimeout()

次のように変更します。

t = setTimeout(hideNav, 1000);

で文字列を使用すると、文字列の評価setTimeout()に使用するように強制さeval()れ、その場合、ローカルコンテキストではなく、グローバルコンテキストが使用されます。したがって、これは実際にはグローバル関数ではないと思いhideNav()ます(おそらく、このコードは他の関数にラップされています)。

さらに、文字列ではなく直接関数参照を使用する方が常に優れており、はるかに高速です。直接関数参照を使用するときは、後で括弧を付けないでください。関数への参照が必要ですが、すぐに実行して戻り値を渡したくはありません。これは、関数を使用した場合の結果です。t = setTimeout(hideNav(), 1000);

于 2012-04-14T01:54:41.057 に答える