Javascript 中使用 setTimeout 的作用域问题
Scope issue in Javascript with setTimeout
范围问题,我认为函数语句总是被提升到当前上下文的顶部。那么为什么在下面没有定义'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);
,它会做什么
相关文章:
- 作用域问题-此函数是否形成闭包-JavaScript
- 访问Javascript对象-Node.js的作用域问题
- 尝试将变量传递到对象中时的作用域问题'的方法构造函数
- 'simple'套接字中的作用域问题.IO服务器
- Javascript作用域问题,对象在分配后没有数据
- 可能存在Javascript作用域问题
- 本地Javascript作用域问题
- 设置Javascript函数的作用域问题
- Javascript 中使用 setTimeout 的作用域问题
- 作用域问题反应父子方法ES6
- jquery get中的作用域问题
- 绑定时出现Javascript作用域问题
- 试图覆盖全局变量时出现jQuery.post()作用域问题
- 作用域问题Uncaught ReferenceError
- 使用reduce串行链接Javascript承诺时的作用域问题
- Javascript变量作用域问题-错误:类型错误:this.graphics未定义
- extjs 4中的作用域问题
- 变量未正确赋值,可能存在作用域问题(getJSON()中的each()中有一个开关的函数)
- Javascript作用域问题:函数在$(doc).ready()中可用,但在事件处理程序中不可用
- Angular 2服务单例作用域问题