天天看點

[Effective JavaScript 筆記] 第8條:盡量少用全局對象

[Effective JavaScript 筆記] 第8條:盡量少用全局對象

初學者容易使用全局變量的原因 建立全局變量毫不費力,不需要任何形式的聲明(隻要在非函數裡用var 你就可以得到一個全局變量) 寫得代碼簡單,不涉及到大的項目或配合(寫hello world是不會有什麼問題的) 使用全局變量的不利之處 污染共享的公共命名空間 導緻意外的命名沖突(比如你的代碼别人引用了

初學者容易使用全局變量的原因

  • 建立全局變量毫不費力,不需要任何形式的聲明(隻要在非函數裡用var 你就可以得到一個全局變量)
  • 寫得代碼簡單,不涉及到大的項目或配合(寫hello world是不會有什麼問題的)

使用全局變量的不利之處

  • 污染共享的公共命名空間
  • 導緻意外的命名沖突(比如你的代碼别人引用了,别人代碼裡有相同的全局變量的引用)
  • 全局變量不利于子產品化,導緻程式中獨立元件間的不必要的耦合

優秀程式員的作法

  1. 不斷地留意程式的結構
  2. 持續地歸類相關的功能以及分離不相關的元件
  3. 将1,2行為作為程式設計過程中的一部分

使用全局變量的原因

全局命名空間是js程式中獨立的元件進行互動的唯一途徑。利用全局命名空間的情況是不可以避免的。

元件或程式庫不得不定義一些全局變量,以便程式中的其他部分使用。否則,最好盡量使用局部變量。

即使在很簡單的函數中将臨時變量定義為全局的,我們都會擔心是否有任何其他的代碼可能會使用相同的變量名。

下面小例子一個:

var i,n,sum;

function averageScore(players){

    sum = 0;

    for(i=0,n=players.length;i<n;i++){

          sum+=score(plaerys[i]);

    }

    return sum/n;

}

如果score函數出于自身的目的使用了任何同名的全局變量,averageScore函數的定義将出現問題。

function score(palyer){

      sum=0;

      for(i=0,n=player.levels.length;i<n;i++){

               sum+=palyer.levels[i].score;

     }

     return sum;

保持變量為局部變量僅将其作為需要使用它們的代碼的一部分。

sum = 0;

for(i=0,n=players.length;i<n;i++){

sum+=score(plaerys[i]);

return sum/n;

sum=0;

for(i=0,n=player.levels.length;i<n;i++){

     sum+=palyer.levels[i].score;

return sum;

全局對象 window

js的全局命名空間也被暴露為在程式全局作用域中可以通路的全局對象,該對象作為this關鍵字的初始值。在web浏覽器中,全局對象被綁定到全局的window變量。添加或修改全局變量會自動更新全局對象。

this.foo;//undefined

foo=”global foo”;

this.foo;//”global foo”

類似地,更新全局對象也會自動地更新全局命名空間。

var foo=”global foo”;

this.foo=”changed”;

foo;//”changed”

這意味着你建立一個全局變量有兩種方法可供挑選。

  1. 可以在全局作用域中使用var聲明變量
  2. 将其加入到全局對象中。

var 聲明的好處是更能清楚地表達全局變量在程式範圍中的影響。

鑒于引用未綁定的變量會導緻運作錯誤,是以,保持作用域清晰和簡潔會使代碼的使用者更容易了解程式聲明了哪些全局變量。

雖然最好限制使用全局對象,但是它确實提供了一個不可或缺的特殊用途。由于全局對象提供了全局環境的動态反應機制,是以可以使用它來查詢一個運作環境,檢測在這個平台下哪些特性是可的。

例如:ES5中引入了全局的JSON對象來讀寫JSON格式的資料。将代碼部署到一個不确定是否提供了JSON對象的環境的一個權宜之計是,你可以測試這個全局對象是否存在并提供一個替代實作。

if(!this.JSON){

       this.JSON={

               parse:….,

               stringify:…

       }

首選宿主環境實作

直接使用自己的實作,也是可以的。但由宿主環境提供的内置實作幾乎總是更合适的。因為它們按照一定的标準對正确性和一緻性進行了嚴格檢查,并且普遍來說比第三方實作提供了更好的性能。

平台特性檢測

  • 使各種各樣的浏覽器和浏覽器版本中可能會執行同樣的代碼。
  • 使得程式在平台特性集合的變化中依舊健壯的相對簡單的方法。
  • 也适用于其他地方。例如,此技術使得在浏覽器和js伺服器環境中共享程式庫成為可能。

提示

  • 避免使用全局變量
  • 盡量聲明局部變量
  • 避免對全局對象添加屬性
  • 使用全局對象來做平台特性檢測

版權聲明

翻譯的文章,版權歸原作者所有,隻用于交流與學習的目的。

原創文章,版權歸作者所有,非商業轉載請注明出處,并保留原文的完整連結。

繼續閱讀