为什么setTimeout(“otherFunction()”,2000)错了?

时间:2012-01-31 07:55:43

标签: javascript closures

我是java脚本的新手,目前正在阅读John Resig的Pro javascript技术。在解释闭包时,他将类似setTimeout("otherFunction()",2000)的调用称为新JS开发人员遇到问题的实例。我不明白为什么这是一个问题?有人可以解释一下吗?在http://www.w3schools.com/js/js_timing.asp我看到var t=setTimeout("alertMsg()",3000);之类的电话看起来与我类似。

5 个答案:

答案 0 :(得分:6)

“错误”,它不一定是“正确的”,当然不推荐。

setTimeout() function的第一个参数可以是字符串或函数引用/函数表达式。

如果你传递一个字符串,它会更慢,因为你实际上正在eval() not recommended。比速度更重要的是,字符串中的代码执行的范围可能不是您期望的(并且在不同的浏览器中可能不同)。

通过传递函数引用/函数表达式,可以避免这些问题。

您的示例的“正确”语法是:

setTimeout(otherFunction, 2000);

注意otherFunction后没有括号 - 如果有,它会立即调用otherFunction()并将该函数的返回值传递给setTimeout()

如果需要将参数传递给函数,可以将其包装在匿名函数中:

setTimeout(function() {
    otherFunction(param1, param2);
}, 2000);

setTimeout("otherFunction(param1,param2)", 2000)相比,这似乎有点笨拙,但同样避免了otherFunctionparam1param2定义范围的问题。

答案 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()"