范围问题,我认为函数语句总是被提升到当前上下文的顶部。那么为什么'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);
}
答案 0 :(得分:6)
更改,
setTimeout("hideNav()",1000);
到
setTimeout(hideNav, 1000);
hideNav
仅在当前上下文中定义,但您将字符串传递给setTimeout
。在全局对象的上下文中发生超时时,将对该字符串进行评估。由于您的hideNav
函数未在全局对象中定义,因此会抛出异常。
通过直接将对函数的引用传递给setTimeout
,您不必担心它。
答案 1 :(得分:2)
在这种情况下,请勿使用带setTimeout()
的字符串。
将其更改为:
t = setTimeout(hideNav, 1000);
使用带有setTimeout()
的字符串强制它使用eval()
来评估字符串,当它执行此操作时,它使用全局上下文,而不是本地上下文。所以,我的猜测是hideNav()
实际上并不是一个全局函数(你可能将这个代码包含在其他函数中)。
此外,使用直接函数引用而不是字符串总是更好,也更快。请记住,当您使用直接函数引用时,请不要在后面添加括号。你想要一个对函数的引用,你不想立即执行它并传递返回值,这就是你使用t = setTimeout(hideNav(), 1000);