2012-02-21 43 views
1

理论案例。 函数init()可能不总是在页面上调用。我想知道的是,这两个脚本之间的速度/效率观点有什么不同? Class是一个单身人士会加载速度/处理量有所不同吗?这些脚本之间的效率有差异吗?

脚本1:

// Class is a singleton. 
var Class = 
{ 
    myFunctionOne : function() 
    { 
    } 

    myFunctionTwo: function() 
    { 
    } 
} 

function init() 
{ 
    //Do some fancy stuff 

    Class.myFunctionOne(); 
    Class.myFunctionTwo(); 
} 

脚本2:

function Class() 
{ 
    this.myFunctionOne = function() 
    { 
    } 

    this.myFunctionTwo = function() 
    { 
    } 
} 

function init() 
{ 
    var myClass = new Class(); 

    //Do some fancy stuff 

    myClass.myFunctionOne(); 
    myClass.myFunctionTwo(); 
} 
+2

你可以在[jsperf]测试(http://www.jsperf.com) – 2012-02-21 17:28:32

+2

我想这应该在代码审查发布:http://codereview.stackexchange.com/ – Fabian 2012-02-21 17:29:18

+0

像大多数其他的性能问题...这可能取决于实施。如果你好奇,就测试一下。 – 2012-02-21 17:35:44

回答

0

我要说的是,你的第二个脚本性能上的优势,当init()被调用的页面上。这是为什么。

在你的第一个例子中,对象字面将每个页面加载时间解析:

var Class = 
{ 
    myFunctionOne : function() { ... } 
} 

Class对象将建成,每个按键的功能对象。不管这些“方法”是否真的被调用过,这个开销都会发生(尽管某些JavaScript编译器可能会在这里实现优化,例如“实时编译”,所以实际性能增益可能因浏览器而异)

在您的第二个例子:

function Class() 
{ 
    this.myFunctionOne = function() { ... } 
} 

myFunctionOne线正在每次Class运行正在被呼叫,你的情况通过new运算符。每次执行Class时,此成本将发生,而不是每页加载一次。然而你已经说过这个类正在使用单例模式,所以你只会有一个实例。

0

如果您担心初始页面加载/处理时间,为什么即使在页面上也有代码。动态加载JavaScript。

function init() { 
    if(!document.getElementById("SingletonClass")) { 
     var dynScript = document.createElement('script'); 
     dynScript.id = "SingletonClass"; 
     dynScript.type = "text/javascript"; 
     dynScript.src = "SingletonClass.js"; 
     document.getElementsByTagName('head')[0].appendChild(dynScript); 
    } 
} 

或者简单地使用jQuery getScript函数。 http://api.jquery.com/jQuery.getScript/