调用全局定义的javascript函数或作为全局变量的属性是否更快?
例如:
选项1
.html:
<input type="checkbox" name="" value="" onClick="dofind()">
.js:
function dofind() { /* code */ }
选项2
.html:
<input type="checkbox" name="" value="" onClick="x.dofind()">
.js:
var x = {
dofind: function() { /* code */ }
}
答案 0 :(得分:3)
在本地范围内调用函数的速度要快得多。你需要在它甚至明显之前进行数百万次调用,而在onclick
处理程序中并非如此。
但这些方法都不是理想的。您最好在unobtrusive adding an onclick
event listener之前选择after the DOM has loaded路线。
答案 1 :(得分:2)
如果考虑事件侦听器的作用域链,在第一种情况下,它必须解析侦听器作用域链上的对象上的标识符 dofind 。据推测,它不会在任何中间对象上找到,并且可以在全局对象上找到。然后它会被调用。
在第二种情况下,标识符 x 必须在类似(相同的?)范围链上解析,一旦找到,标识符 dofind 必须在该物体的财产。
逻辑说第二种方法因为时间较长而慢。但是,javascript引擎可以根据需要优化范围链和属性访问。很可能(在现代浏览器中)对 dofind 的后续调用将直接进行,而不引用范围链,除非引擎认为链可能已被更改。
在各种浏览器中进行测试将揭示哪些优化此类调用以及哪些不优化。我认为你会发现,在整体应用程序性能方面,调用的差异可以忽略不计,特别是因为解析标识符的速度比用户启动一系列点击事件(可能是1000或更多)要快得多。
答案 2 :(得分:0)
除非您在页面上加载了数千个此类事件处理程序,否则您不会注意到任何性能差异。当您在页面上加载了数千个带有事件处理程序的元素时,附加事件处理程序所花费的时间将是您遇到的最小问题。