2013-01-18 114 views
-1

我測試2對場景:立即執行功能表現

1)傳遞一個全局變量作爲自變量...

(function(d){ 
    //do some stuff with d 
    return //something 
})(document); 

...或指定全局的局部變量。

(function(){ 
    var d = document; 
    //do the same stuff 
    return //something 
})(); 

結果從瀏覽器到瀏覽器,從版本到版本,甚至從測試到測試都是不同的!

2.)我有一個通過XMLHttpRequest獲取的大型數據對象。假設這個對象可以通過幾種方法訪問,但只有一個與父函數的作用域相關。

(function(){ 
    //get data object 
    var data = response; 
    //change GUI, assign events, do some other stuff 
    var searchInData = function(id){ //this will be used often 
     //code 
    }; 
    //data object won't be accessed any more 
    //a lot of code 
    return //something 
})(); 

...或使用它?

(function(){ 
    var search = (function(){ 
     var data = response; 
     //change GUI, assign events, do some other stuff 
     return function(id){ 
     //code 
     } 
    })(); 
    //other stuff 
    return //something 
})(); 

同樣,我無法得到明確的結果,因此:使用哪個,爲什麼以及何時使用?

+3

使用最簡單,最清晰的代碼。編寫同一段代碼有無限多種方式。 – Jon

+0

儘管差異可能最小,但要測試的最佳位置是http://jsperf.com/ – ManseUK

回答

2

1結果從瀏覽器到瀏覽器,從版本到版本,甚至從測試到測試都有所不同!

然後使用你發現更好的閱讀。例如,選項#1會少寫,但沒有描述性參數很難理解長函數(您需要向下滾動以瞭解變量包含的內容)。

2使用閉合?

我認爲//a lot of code是相關的東西。這兩個函數都可以訪問該代碼範圍內的變量,如果不使用閉包(選項#2),則大量代碼具有範圍內的局部變量。如果您使用閉包,瀏覽器可能會優化垃圾收集並更好地進行內存管理。但是,這將取決於//other stuff的實際內容 - 對於異步代碼,我會建議關閉。

+0

//大量代碼或其他內容=更多ajax調用,更多計算等等,並且不訪問數據對象,只是使用搜索功能。 //改變GUI,分配事件,做一些其他的東西從該範圍訪問單個變量 - 文檔對象。 – Tondo

+0

...但是'search'使用'data'對象。我完全不知道你的代碼,但是試着做一些以後不需要的變量(如果有的話)可以被垃圾收集。特別是將它們放在GUI事件處理程序的範圍之外。 – Bergi

+0

這就是問題所在。我有一個非常特定的層次結構的巨大的數據對象,我的工作是以breadcrumb =創建和刪除元素,事件,處理程序的形式顯示數據...這就是爲什麼我在想它 - 把數據對象,DOM對象,特定變量和事件處理程序合併到一個單獨的塊中。稍後由於其他原因使用搜索,但必須有權訪問數據對象。數據對象在整個會話中不會改變。 – Tondo