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

这两种方式中哪一种更快,为什么?
window.setTimeout("func()", 100);
要么
window.setTimeout(function(){func();}, 100);
我猜第二种方式更快,如果没有其他原因除了John Resig和所有忍者都使用它,我猜测因为它已经解析了,而不是第一种方式,它必须创建一个新的解析“thingie ”。我依稀记得这是人们不喜欢eval()的原因之一。 同时我在这里,在第二个代码snipplet中,是第一个在这种情况下被认为是良好做法的分号?     
已邀请:
还有第三个更快/更简单的选项:
window.setTimeout(func, 100);
...严格地与你的问题有关,第二个更快,因为它仍然是一个参考 - 而不是评估,这总是相当昂贵。至于分号,是的,总是使用它们是一个好习惯。他们应该永远不会成为IMO的选择,但很多人不同意我的意见......但你不能真正反对在你的代码中明确表示,这总是一件好事。     
正如你所写,它们同样“安全”。当你试图传递参数时会出现安全问题,因为有一种诱惑要做这样的事情:
setTimeout('func('+arg+')', 100);
哪个具有代码注入的潜力。有人会用它来摧毁你的死星。迟早,一个年轻的绝地武士会弄清楚如何欺骗你的应用让
arg
等于
3.14); deathStar.selfDestruct(
,接下来你知道,你接到皇帝的电话来解释你的错误。 可能不是你犯了错误......你永远不会做任何愚蠢的事情。当你的代码在6个月之后被实习生重构时,他们需要添加一个参数,那就是问题出现的时候。 所以字符串形式只是被认为是不好的做法。它速度较慢,可能不太安全。     
在内部使用'setTimeout'和字符串语法使得javascript引擎'eval'它。每当浏览器在代码中的任何地方遇到'eval'时,它就无法进行许多优化(因此禁用它们),因为任何东西都可以进入eval。 使用代码中存在的'eval'无法实现缓存变量等优化,因为'eval'可能会引入新的变量,这些变量在Javascript的编译阶段会被忽略(它会检测所有声明)。 第二种语法更快,因为它只是在延迟后调用函数,你不会陷入'ev​​al'的邪恶。     
你提到的人使用它可能不是因为它更快。      备用语法中的代码是您希望在延迟毫秒后执行的一串代码。 (建议不要使用此语法,原因与使用eval()相同)    来自https://developer.mozilla.org/en/DOM/window.setTimeout     
我不认为现代浏览器中的任何一个都快得多。即使一个更快一些,仅仅是你的代码不会过于频繁地调用setTimeout的事实使得这一点没有实际意义。 第一个具有更易读的好处,并且是我的偏好。     

要回复问题请先登录注册