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

Inq*_*ive 1 javascript closures

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

nnn*_*nnn 6

不是 "错误的",它不一定是"正确的",并且肯定不推荐.

setTimeout()函数的第一个参数可以是一个字符串或一功能参考/函数表达式.

如果你传递一个字符串,这将是有效的,因为你正在做的慢eval()这是不推荐使用.比速度更重要的是,字符串中的代码执行的范围可能不是您所期望的(并且在不同的浏览器中可能不同).

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

您的示例的"正确"语法是:

setTimeout(otherFunction, 2000);
Run Code Online (Sandbox Code Playgroud)

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

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

setTimeout(function() {
    otherFunction(param1, param2);
}, 2000);
Run Code Online (Sandbox Code Playgroud)

这似乎那种笨重相比,setTimeout("otherFunction(param1,param2)", 2000)但同样避免了在那里的范围问题otherFunction,param1param2定义.


Dar*_*rov 5

建议的方法是使用以下内容:

setTimeout(otherFunction, 2000);
Run Code Online (Sandbox Code Playgroud)

或封闭:

setTimeout(function() {
    otherFunction();
}, 2000);
Run Code Online (Sandbox Code Playgroud)

不要使用带有字符串作为第一个参数的重载,因为javascript解释器需要将此字符串解析为javascript代码.

是的,您链接到http://www.w3schools.com的网站可能是学习编程的最差网站之一.它显示了你不应该做的事情.

  • -1"为什么我不应该在setTimeout中使用字符串?" - "因为推荐的方法是不使用字符串." (3认同)
  • 我相信@molf正在制作的观点是你没有解释_why_字符串不推荐. (2认同)