使用setTimeout在Javascript中的范围问题

时间:2012-04-14 01:53:01

标签: javascript scope

范围问题,我认为函数语句总是被提升到当前上下文的顶部。那么为什么'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);
}

2 个答案:

答案 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);

时会做的事情