2012-04-14 12 views
1

スコープの問題は、機能文が常に現在のコンテキストの先頭にぶら下がっていると思いました。では、なぜhideNav()は未定義ですか?Javascriptでスコープの問題が発生しました。

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); 
} 

答えて

6

変更、

setTimeout("hideNav()",1000); 

setTimeout(hideNav, 1000); 

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

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

2

この場合、setTimeout()の文字列を使用しないでください。それはあなたの文字列とするとき、それはグローバルな文脈ではなく、あなたのローカルコンテキストを使用しています、というんを評価するためにeval()を使用するsetTimeout()力を持つ文字列を使用して

t = setTimeout(hideNav, 1000); 

:へ

変更に。だから、私の推測では、hideNav()は実際にはグローバル関数ではありません(おそらくこのコードは他の関数の中にラップされています)。

さらに、文字列ではなくダイレクト関数参照を使う方が良いでしょう。直接関数参照を使用するときは覚えておいてください。その後はかっこを入れないでください。関数への参照が必要な場合は、すぐに実行し、使用した場合の戻り値を渡す必要はありませんt = setTimeout(hideNav(), 1000);

関連する問題