2012-02-21 46 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/