2011-02-05 66 views
13

的JavaScript:好的部分定義這類聲明的那樣糟糕:「隱含全局變量」的一些問題是什麼?

foo = value; 

書中說「讓遺忘變量全球的JavaScript的策略創建 錯誤,可以是非常難以找到。」

除了典型的全局變量常見的危險之外,這些隱含的全局變量的一些問題是什麼?

回答

14

正如this answer的評論中所述,設置某些值可能會產生意想不到的結果。

在Javascript中,這很可能是因爲設置全局變量實際上意味着設置window對象的屬性。例如:

function foo (input) { 
    top = 45; 
    return top * input; 
} 
foo(5); 

這將返回NaN,因爲你不能設置window.top和乘以window對象不起作用。將其更改爲var top = 45的作品。

其他不能更改的值包括document。此外,還有其他一些全局變量,如果設置了,就會做出令人興奮的事情。例如,設置window.status會更新瀏覽器的狀態欄值,並且window.location會轉到新位置。

最後,如果更新某些值,可能會失去一些功能。例如,如果您將window.frames設置爲字符串,則不能使用window.frames[0]來訪問框架。

4

全局變量使得很難隔離你的代碼,並在新的上下文中重用它。

Point#1: 如果您有一個Javascript對象依賴於全局變量。您將無法在應用程序中創建此對象的多個實例,因爲每個實例都將更改全局值,從而覆蓋之前由另一個實例寫入的數據。 (當然,除非這個變量保持一個與所有共同的值 - 但更多的時候你會發現這樣的假設是錯誤的)。

Point#2: 全局變量很難將現有的代碼片段重用到新的應用程序中。假設你在一個文件中定義了一組函數,並且你想在其他文件中使用它們(在另一個應用程序中)。因此,您將它們解壓縮到一個新文件中,並將該文件包含在新應用程序中。如果這些函數依賴於全局,則第二個應用將在運行時失敗,因爲全局變量不存在。代碼中不可見對全局變量的依賴,因此忘記這些變量(將函數移動到新文件時)可能會帶來危險。

+0

阿門到#2。我一直在工作中遇到這個問題。我們喜歡全局變量! :( – 2011-02-07 14:49:43

1

它們是全局變量,所以,所有的「常見危險」都適用。區別於其他語言的全局變量的主要原因是:

  • 您不明確地在全局範圍內聲明它們。如果在變量聲明中錯誤地忽略了var,則意外地聲明瞭全局變量。JavaScript使得它非常容易無意識地聲明全局變量;與Scheme相反,如果在全局範圍內未定義變量,則會引發錯誤。
  • 至少在瀏覽器中,全局變量的別名爲window[variable_name]。這可能令人擔憂。例如,您的一些代碼可能訪問window['foo'](意在訪問全局變量)。然後,如果您在程序中的其他地方不小心輸入了foo而不是var foo,則您已聲明對window['foo']的引用,這意味着要保持獨立。
0

一個問題是,您可能踐踏已定義的變量並且不知道它,從而在代碼的其他部分造成奇怪的副作用,這可能是追蹤的負擔。

另一個是它只是草率的代碼。你不應該創建比他們需要的範圍更大的變量,因爲至少它會在內存中保留更多的變量,並且最糟糕的是它可以創建你不想要的數據場景。

底線是,當你這樣做時,你不確定你是否搞亂了使用同名全局變量的其他函數。有時它甚至不是你的錯,另一個插件的懶惰程序員留下了一些全球性的東西,這意味着它的功能範圍內。因此,編寫更好,更少錯誤的代碼是非常實用的保障。

0

典型全局變量的問題在於它們是全球性的 - 沒有範圍來包含它們,並且任何正在執行/與之交互的代碼(例如您稱之爲道路的庫)都可以修改變量而不發出警告。 - 對於唯一的要求是忘了var關鍵字

  1. 你可以在任何地方定義一個全局變量:

    然而,這些問題在Javascript中的兩件事情複雜化。

  2. 當你無意這樣做時,定義一個全局變量是非常容易的。這就是「隱含的」全局變量相對於「典型的」全局變量的問題 - 你甚至不知道你是否創建了它們。

在一個合理的設計語言,包括真正的全局變量(OK,所以不合理設計的),你將有地方有限的幾個定義全局變量,它需要一個特殊的關鍵字來這樣做。