setTimeout()与字符串或(匿名)函数引用? speedwise

时间:2010-12-22 04:07:10

标签: javascript performance coding-style

这两种方式中的哪一种更快,为什么?

window.setTimeout("func()", 100);

或者

window.setTimeout(function(){func();}, 100);

我猜第二种方式更快,如果没有其他原因除了John Resig和所有忍者都使用它,我猜是因为它已经解析,而不是第一种方式,它必须创建一个新的解析“thingie”。我隐约记得这是人们不喜欢eval()的原因之一。

另外,虽然我有你在这里,在第二个代码snipplet中,是第一个在这种情况下被认为是良好做法的分号?

5 个答案:

答案 0 :(得分:25)

还有第三个更快/更简单的选项:

window.setTimeout(func, 100);

...严格地与你的问题有关,第二个更快,因为它仍然是一个参考 - 而不是评估,这总是相当昂贵。至于分号,是的,总是使用它们是一个好习惯。他们应该永远不会成为IMO的选择,但很多人会不同意我的意见......但你不能反对在你的代码中明确表示,这总是一个好的事情。

答案 1 :(得分:8)

正如你所写,它们同样“安全”。当你试图传递参数时会出现安全问题,因为有这样的诱惑:

setTimeout('func('+arg+')', 100);

具有代码注入的潜力。有人用它来摧毁你的死亡之星。迟早,一个年轻的绝地将会弄清楚如何欺骗你的应用让arg等于3.14); deathStar.selfDestruct(,接下来你知道,你接到皇帝的电话来解释你的错误。

可能不是你犯了错误......你从不做任何如此愚蠢的事情。当你的代码在6个月之后被实习生重构时,他们需要添加一个参数,那就是问题出现的时候。

所以字符串形式只是被认为是不好的做法。它速度较慢,可能不太安全。

答案 2 :(得分:4)

使用' setTimeout'使用字符串语法在内部制作javascript引擎' eval'它。每当浏览器遇到“评估”时。在代码中的任何地方,它都无法进行许多优化(因此禁用它们),因为任何东西都可以进入eval。

使用' eval'无法完成缓存变量等优化。代码中存在因为' eval'可能会引入新的变量,这些变量在Javascript的编译阶段会被忽略(它会检测所有声明)。

第二种语法更快,因为它会在延迟后调用函数,而你却不会陷入“eval”的邪恶之中。

答案 3 :(得分:2)

你提到的人使用它可能不是因为它更快。

  
      备用语法中的
  • 代码是延迟毫秒后要执行的代码字符串。 (建议不要使用此语法,原因与使用eval())
  • 相同   

来自https://developer.mozilla.org/en/DOM/window.setTimeout

答案 4 :(得分:0)

我不认为现代浏览器中的任何一个都快得多。即使一个更快一些,仅仅是你的代码不会过于频繁地调用setTimeout的事实使得这一点没有实际意义。

第一个具有更易读的好处,并且是我的偏好。