2011-03-04 104 views
1

讓說,我有以下情形:現在javascript函數範圍,變量聲明

var namespace = {}; 
(function($) 
{ 
    $.extend(namespace, 
    { 
     test1: function(someArray, someObj) 
     { 
      for(var i= 0, ii= someArray.length;i<ii;i++) 
      { 
       var text = someObj[someArray[i]]; 
       // do something with text 
      } 
     }, 
     test2: function(someArray, someObj,i,ii,text) 
     /* 
      see that the i,ii,text are unused parameters, 
      that will be used instead of variables 
     */ 
     { 
      for(i= 0, ii= someArray.length;i<ii;i++) 
      { 
        text = someObj[someArray[i]]; 
       // do something with text 
      } 
     }, 
    }); 
})(jQuery); 

中,TEST1和TEST2的結果都是一樣的......但什麼性能,內存使用情況.. 在上面介紹的兩種方法中,聲明i,ii,測試變量有什麼區別嗎?

例如,我認爲test2可能更高效,因爲變量位於本地函數作用域中,所以在函數退出後,執行上下文將被銷燬,釋放用於參數的資源......變量將不會被分配給全局對象'窗口'。

那麼什麼方法表現最好?爲什麼?


[編輯]

感謝所有爲你解答!

如果代碼具有可讀性問題,則沒有問題...我現在只關注性能/內存使用情況。

+0

沒有你關心的性能差異。 – Raynos 2011-03-04 13:47:08

回答

1

如果你沒有用var i聲明你的變量,那麼它們就變成了隱含的全局變量。

總是聲明你的變量。如果你做了任何基準測試,你會發現聲明的局部變量實際上更快而隱含的全局變量。你也不會以這種方式泄漏到全局狀態。

Benchmark!

正如您所見,性能是相同的。

就內存使用而言,局部變量(test1)可能更好,因爲編譯器不必記住該函數有5個參數。

但是,這是一個納米優化如果你關心這個口徑的性能差異寫裝配代替。去可讀支持代碼。

[編輯]

沒有注意到方法參數 「局部」 變量。這是一個可讀性殺手!不要這樣做。你會發現test1可能仍然更有效率。

+0

我並不反對,但請注意,在「test2」中,標識符被列爲功能的參數(推測未使用)。 – Pointy 2011-03-04 13:35:48

+0

@Pointy如上所述,我沒有注意到。這是一個可怕的可讀性點。 – Raynos 2011-03-04 13:38:03

+0

此外,我不知道爲什麼,但test2在Firefox 4 beta 12上表現糟糕...... – Martijn 2011-03-04 13:53:09

0

「test1」中的變量全部用var聲明,因此它們全局爲而不是。這兩個應該基本相同。

1
  1. 爲什麼不分析你的代碼?
  2. 變量也是本地的test1。你用var i來聲明它們。 這些方法沒有區別。
0

test1更快,因爲每次JavaScript查找符號(如變量名稱)時,都會從查找本地範圍開始。因此,通過使用全局範圍,它必須查找更多地方纔能找到符號。這同樣適用於參數,但它們比全局變量更好。

+0

不使用全球範圍...仔細看! – awm 2011-03-04 13:37:40

+0

它們在'test2'中也是本地的。 – 2011-03-04 13:37:41

+0

我沒有說他正在使用全球範圍。仔細地看! :)我解釋了爲什麼本地範圍比全球更快。在這個等級中,參數比當地人「更遠」。 – Simeon 2011-03-04 13:43:39

0

它可能很小,但是在每次迭代中聲明一個新的變量(文本)需要新的內存分配,我相信。雖然我不確定JavaScript是如何處理的。我通常會事先聲明變量,然後爲此分配值,但那只是因爲有人說「嘿,你應該這樣做」,並提出了相同的論點。