OOJS在功能JavaScript编程方面的表现

Rya*_*P13 2 javascript oop performance functional-programming object

这个问题与前一个问题有关:

减少对JavaScript对象方法的调用次数

使用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);
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

它认为后者对InjectScriptsAndExecute方法的调用要比前者对其函数的调用快得多.一位同事问我为什么当我提到性能改进但我无法自己解释时.

任何有关更好理解的建议都会受到极大的欢迎.

Ivo*_*zel 7

参数是不是 Array这是一个Object多少有些行为就像一个数组.

if(arguments.length > 0) { // Slow AND superfluous
    for (var i = 0; i < arguments.length; i++) { // Even SLOWER
        arguments[i]; // Holy...
Run Code Online (Sandbox Code Playgroud)

缓存长度,访问属性很慢,IE6根本就没有优化,.length我甚至怀疑它在使用时非常慢,arguments[i]因为它不是真实的Array,因此可能会进行未优化的属性查找.

如果你想获得两全其美的,通过正常的Array,使用普通的for循环,cachelength.

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"]);
Run Code Online (Sandbox Code Playgroud)

编辑

为了说清楚,定时循环是没用的,请求是异步的,你要做的就是定时循环和调用$.ajax这里没有优势,特别是对于两个条目.即使在IE6中,执行Ajax调用本身(甚至只是调用$.ajax)也会比循环慢.