Javascript 中使用 setTimeout 的作用域问题

Scope issue in Javascript with setTimeout

本文关键字:作用域 问题 setTimeout Javascript      更新时间:2023-09-26

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

更改,

setTimeout("hideNav()",1000);

setTimeout(hideNav, 1000);

hideNav仅在当前上下文中定义,但您要将字符串传递给setTimeout 。当超时发生在全局对象的上下文中时,该字符串将被评估。由于您的 hideNav 函数未在全局对象中定义,因此它将引发异常。

通过直接将对函数的引用传递给 setTimeout ,您不必担心它。

在这种情况下,

不要使用带有setTimeout()的字符串。

将其更改为:

t = setTimeout(hideNav, 1000);

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

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