首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象编程在函数式JavaScript编程上的性能

面向对象编程在函数式JavaScript编程上的性能
EN

Stack Overflow用户
提问于 2011-01-10 22:35:50
回答 1查看 2.1K关注 0票数 2

这个问题与前面的问题有关:

Reducing number of calls to the methods of a JavaScript object

在使用Firebug分析这两个代码片段时:

代码语言:javascript
复制
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);

代码语言:javascript
复制
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方法的调用比前者对其函数的调用快得多。当我提到性能改进时,一位同事问我为什么,但我自己无法解释。

任何更好地理解的建议都会得到很好的接受。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-10 22:55:23

Arguments is ,not Array,这是一个Object,它的行为有点像一个数组。

代码语言:javascript
复制
if(arguments.length > 0) { // Slow AND superfluous
    for (var i = 0; i < arguments.length; i++) { // Even SLOWER
        arguments[i]; // Holy...

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

如果你想两全其美,传递一个普通的Array,使用一个普通的for循环,然后cache这个length

代码语言:javascript
复制
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"]);

编辑

需要说明的是,给循环计时是没用的,请求是异步的,你所要做的就是给循环计时和对$.ajax的调用计时。这里没有优化的意义,特别是对于的两个条目。即使在IE6中,进行Ajax调用本身(即使只是调用$.ajax)也会比循环慢得多。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4647887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档