我是java脚本的新手,目前正在阅读John Resig的Pro javascript技术。在解释闭包时,他将类似setTimeout("otherFunction()",2000)
的调用称为新JS开发人员遇到问题的实例。我不明白为什么这是一个问题?有人可以解释一下吗?在http://www.w3schools.com/js/js_timing.asp我看到var t=setTimeout("alertMsg()",3000);
之类的电话看起来与我类似。
答案 0 :(得分:6)
不“错误”,它不一定是“正确的”,当然不推荐。
setTimeout()
function的第一个参数可以是字符串或函数引用/函数表达式。
如果你传递一个字符串,它会更慢,因为你实际上正在eval()
not recommended。比速度更重要的是,字符串中的代码执行的范围可能不是您期望的(并且在不同的浏览器中可能不同)。
通过传递函数引用/函数表达式,可以避免这些问题。
您的示例的“正确”语法是:
setTimeout(otherFunction, 2000);
注意otherFunction
后没有括号 - 如果有,它会立即调用otherFunction()
并将该函数的返回值传递给setTimeout()
。
如果需要将参数传递给函数,可以将其包装在匿名函数中:
setTimeout(function() {
otherFunction(param1, param2);
}, 2000);
与setTimeout("otherFunction(param1,param2)", 2000)
相比,这似乎有点笨拙,但同样避免了otherFunction
,param1
和param2
定义范围的问题。
答案 1 :(得分:5)
建议的方法是使用以下内容:
setTimeout(otherFunction, 2000);
或关闭:
setTimeout(function() {
otherFunction();
}, 2000);
不要使用将字符串作为第一个参数的重载,因为javascript解释器需要将此字符串解析为javascript代码。
是的,您链接到http://www.w3schools.com的网站可能是学习编程的最差网站之一。它显示了你不应该做的事情。
答案 2 :(得分:1)
因为它每次都必须eval
otherFunction()
(因此产生一个新的解释器实例)。如果您提供对该函数的引用,setTimeout
可以执行它而无需生成新的解释器。
所以使用:
setTimeout(otherFunction,2000);
答案 3 :(得分:1)
用“”括起来的任何内容都是一个字符串,因此JavaScript解释器通常需要解析字符串。
即使有效,也不需要解析字符串。
如果我们只是使用
setTimeout(alertMsg,3000);
,
解释器不需要做任何额外的(不必要的)工作,从而产生更好的代码。
答案 4 :(得分:0)
而不是setTimeout("otherFunction()",2000)
,直接通过执行来传递函数
setTimeout(otherFunction,2000)
要好得多。以前的方法必须eval
字符串"otherFunction()"
。