2011-09-21 88 views
3

我是JavaScript新手,並且有關訪問函數中變量的最佳實踐的簡單(我假設)問題:全局變量與將值傳遞給函數?

什麼時候應該聲明全局變量,而不是簡單地將值傳遞給函數?

+0

關於在JavaScript中使用全局變量,StackOverflow已經存在很多問題。如果您使用此頁面右上角的搜索字段,則會發現很多信息。 – user113716

+0

@patrickdw:對不起。就像我所說的,我是JavaScript新手,有時無法自行找到問題。我只是在StackOverflow上做了另一個搜索,看看我能找到什麼 - 不是很適用(可能是由於我的JavaScript新手狀態)。我很樂意閱讀上述材料!什麼是尋找它的好方法? –

+1

此搜索[「什麼時候應該在JavaScript中使用全局變量」](http://stackoverflow.com/search?q=q = when + should + I + use + global + variables + in + javascript)應該給你足夠的素材。你會發現一致的答案是儘可能地避免全局性。任何未在函數中聲明的變量,或未使用'var'聲明的變量都將是全局變量。 – user113716

回答

5

聲明全局變量只能用作最後選項。

全局變量一般不好,特別是在JavaScript中。根本沒有辦法阻止另一塊JavaScript的破壞你的全球。這種破壞會悄然發生並導致運行時錯誤。

以下列爲例。

// Your code 
myParam = { prop: 42 }; 
function operateOnMyParam() { 
    console.log(myParam.prop); 
} 

在這裏,我宣佈2個全局變量

  • myParam
  • operateOnMyParam

而孤立測試你的JavaScript這可能會很好地工作。但是,如果測試用戶與出現這種情況有以下定義

// My code 
function myParam() { 
    console.log("..."); 
} 

這也定義了一個全局命名值其myParam與你擦出myParam我的JavaScript庫結合您的JavaScript庫後會發生什麼。哪一個取決於腳本的導入順序。但無論哪種方式,我們中的一個人都陷入困境,因爲我們的全球物體之一已經死亡

+0

你能解釋一下,或者鏈接到別人的解釋,爲什麼這是? –

+0

@Nathan - http://c2.com/cgi/wiki?GlobalVariablesConsideredHarmful –

+0

@Nathan - 也許對你更好:http://c2.com/cgi/wiki?GlobalVariablesAreBad –

2

有很多很多的原因..但一個簡單的是..函數的參數只存在於函數中,而它正在運行。全局變量存在所有的時間,這意味着:

  • 它佔用的內存中,直到您手動「摧毀」了
  • 每個全局變量的名稱必須是唯一的
  • 如果,你的函數內..你調用另一個函數..最終調用第一個函數,突然間你可能會得到意想不到的結果。

總之:因爲函數參數只活了一個非常短的時間內和之外的功能不存在,它更容易理解這是怎麼回事,並大大降低了錯誤的風險。

2

在處理無框架JavaScript時,我會將我的簡單變量和函數存儲在對象字面上,以免混亂全局命名空間。

var myObject = { 
    variableA : "Foo", 
    variableB : "Bar", 
    functionA : function(){ 
     //do something 
     //access local variables 
     this.variableA 
    } 
} 

//call functions and variables 
myObject.variableA; 
myObject.functionA();