这个问题与之前的问题有关:
Reducing number of calls to the methods of a JavaScript object
使用Firebug分析这两个代码段时:
function ie6PNGFixLoader(scriptURL) {
if(arguments.length > 0) {
for (var i = 0; i < arguments.length; i++) {
$.ajax({// load PNG fix scripts
url: arguments[i],
cache: true,
dataType: 'script'
});
}
} else {
return false;
}
}
var pngFix = "/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js";
var pngList = "/Global/ICIS/Scripts/DD_PNG_listing.js";
ie6PNGFixLoader(pngFix, pngList);
和
function InjectScriptsAndExecute(url) {
this.url = url;
}
InjectScriptsAndExecute.prototype.InjectMethod = function() {
var inject = $.ajax({
url: this.url,
cache: true,
dataType: 'script',
async: false, // Otherwise you cannot depend on the parse order
});
return inject;
}
var pngFix = new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js");
var pngList = new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_PNG_listing.js");
pngFix.InjectMethod();
pngList.InjectMethod();
它认为后者对InjectScriptsAndExecute方法的调用比前者对其函数的调用要快得多。一位同事问我为什么当我提到性能改进但我无法自己解释时。
任何有关更好理解的建议都会受到极大的欢迎。
答案 0 :(得分:7)
参数不 Array
它是Object
,有点像数组。
if(arguments.length > 0) { // Slow AND superfluous
for (var i = 0; i < arguments.length; i++) { // Even SLOWER
arguments[i]; // Holy...
缓存长度,访问属性很慢,IE6根本不会对.length
没有优化,我甚至怀疑使用{{1}时它真的很慢因为它不是真正的arguments[i]
,因此可能会进行未经优化的属性查找。
如果您想充分利用这两个方面,请传递正常Array
,使用普通的Array
循环,for
cache
。
length
修改强>
为了说清楚,定时循环是没用的,请求是异步的,所有你做的是定时循环和调用function ie6PNGFixLoader(scripts) {
for (var i = 0, l = scripts.length; i < l; i++) {
$.ajax({// load PNG fix scripts
url: scripts[i],
cache: true,
dataType: 'script'
});
}
}
ie6PNGFixLoader(["/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js",
"/Global/ICIS/Scripts/DD_PNG_listing.js"]);
这里没有优势,特别是对于 2 < / strong>条目。即使在IE6中,执行Ajax调用本身(甚至只是调用$.ajax
)也会比循环慢。