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()在这种情况下不要使用字符串 with 。

将其更改为:

t = setTimeout(hideNav, 1000);

使用带有setTimeout()强制它的字符串eval()来评估您的字符串,当它这样做时,它使用全局上下文,而不是您的本地上下文。所以,我的猜测是这hideNav()实际上不是一个全局函数(您可能将此代码包装在其他函数中)。

此外,使用直接函数引用而不是字符串总是更好,而且速度也快得多。请记住,当您使用直接函数引用时,不要在后面加上括号。你想要一个对函数的引用,你不想立即执行它并传递返回值,如果你使用它会这样做t = setTimeout(hideNav(), 1000);

于 2012-04-14T01:54:41.057 回答