qwe*_*ymk 16 javascript performance coding-style
这两种方式中哪一种更快,为什么?
window.setTimeout("func()", 100);
Run Code Online (Sandbox Code Playgroud)
要么
window.setTimeout(function(){func();}, 100);
Run Code Online (Sandbox Code Playgroud)
我猜的第二个方法是比约翰Resig的其他没有其他原因,更快,如果所有的忍者们使用它,我猜,因为它已经被解析,而不是它必须创建一个新的解析"的thingie第一种方式".我依稀记得这是人们不喜欢eval()的原因之一.
同时我在这里,在第二个代码snipplet中,是第一个在这种情况下被认为是良好做法的分号?
Nic*_*ver 25
还有第三个更快/更简单的选项:
window.setTimeout(func, 100);
Run Code Online (Sandbox Code Playgroud)
...严格地与你的问题有关,第二个更快,因为它仍然是一个参考 - 而不是评估,这总是相当昂贵.至于分号,是的,总是使用它们是一个好习惯.他们本来就不应该可选IMO,但很多都会同意我的存在......但你真的不能反驳你的代码是明确的,这总是一个很好的事情.
小智 8
正如你所写,它们同样"安全".当你试图传递参数时会出现安全问题,因为有一种诱惑要做这样的事情:
setTimeout('func('+arg+')', 100);
Run Code Online (Sandbox Code Playgroud)
哪个具有代码注入的潜力.有人会用它来摧毁你的死星.迟早,一个年轻的绝地武士会弄清楚如何欺骗你的应用程序使其arg等于3.14); deathStar.selfDestruct(,接下来你知道,你接到皇帝的电话来解释你的错误.
可能不是你犯了错误......你永远不会做任何愚蠢的事情.当你的代码在6个月之后被实习生重构并且他们需要添加一个参数时,就会出现问题.
所以字符串形式只是被认为是不好的做法.它速度较慢,可能不太安全.
在内部使用带有字符串语法的“setTimeout”会使 javascript 引擎对其进行“评估”。每当浏览器在代码中的任何地方遇到“eval”时,它就无法执行许多优化(因此禁用它们),因为任何东西都可以进入 eval。
诸如缓存变量之类的优化无法通过代码中存在的“eval”来完成,因为“eval”可能会引入新变量,这些新变量将在 Javascript 的编译阶段(检测所有声明)被忽略。
第二种语法更快,因为它只会在延迟后调用该函数,并且您不会陷入“eval”的祸害。
| 归档时间: |
|
| 查看次数: |
7057 次 |
| 最近记录: |