2012-01-31 59 views
1

我是java脚本的新手,目前正在阅读John Resig的JavaScript JavaScript技巧。在解释关闭时,他将setTimeout("otherFunction()",2000)称为新JS开发人员遇到问题的情况。我无法理解为什么这是一个问题?有人可以解释一下吗?在http://www.w3schools.com/js/js_timing.asp中,我看到一个类似于我的电话var t=setTimeout("alertMsg()",3000);setTimeout(“otherFunction()”,2000)为什么是错的?

+7

你已经找到了为什么w3schools不是一个很好的学习网站的几个例子之一。有关更多信息,请参见http://w3fools.com/ – 2012-01-31 08:00:56

回答

6

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

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

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

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

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

setTimeout(otherFunction, 2000); 

注意有没有括号otherFunction后 - 如果有它会立即打电话otherFunction()并从该函数传递返回值setTimeout()

如果你需要传递参数给你的功能,你可以在一个匿名函数把它包:

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

这似乎那种笨重相比setTimeout("otherFunction(param1,param2)", 2000),但它再次与其中otherFunctionparam1范围避免问题和param2被定义。

+0

+1提到的范围。 – CMS 2012-01-31 08:09:28

+0

优秀的答案。 – molf 2012-01-31 08:12:33

5

建议的方法是使用以下命令:

setTimeout(otherFunction, 2000); 

或关闭:

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

不要使用这需要一个字符串作为第一个参数过载,因为JavaScript解释器将需要将此字符串解析为JavaScript代码。

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

+3

-1“为什么不在setTimeout中使用字符串?” - “因为推荐的方法是不使用字符串。” – molf 2012-01-31 08:03:29

+0

@molf,是的,正是出于这个原因。你真的不希望强制解释器一遍又一遍地将你的字符串解析为javascript代码。 – 2012-01-31 08:05:24

+2

我相信@molf所做的一点是你没有解释_why_字符串是不推荐的。 – nnnnnn 2012-01-31 08:10:55

1

因为它每次都必须evalotherFunction()(并因此产生一个解释器的新实例)。如果您提供该函数的参考,则setTimeout可以执行它,而不必产生新的解释器。

所以使用:

setTimeout(otherFunction,2000); 
+0

“产卵新实例”正是这个原因,而不是“不推荐”左右。 – georg 2012-01-31 09:06:49

1

任何包含在“”是一个字符串,一个JavaScript解释器通常需要解析的字符串。

即使工作,解析字符串也是不必要的。

如果我们简单地用

setTimeout(alertMsg,3000);

做任何额外的(不必要的)工作,从而更好地代码解释是不需要的。

0

而不是setTimeout("otherFunction()",2000),直接通过做 setTimeout(otherFunction,2000)要好得多。以前的方法必须做eval字符串"otherFunction()"

相关问题