的JavaScript:好的部分定義這類聲明的那樣糟糕:「隱含全局變量」的一些問題是什麼?
foo = value;
書中說「讓遺忘變量全球的JavaScript的策略創建 錯誤,可以是非常難以找到。」
除了典型的全局變量常見的危險之外,這些隱含的全局變量的一些問題是什麼?
的JavaScript:好的部分定義這類聲明的那樣糟糕:「隱含全局變量」的一些問題是什麼?
foo = value;
書中說「讓遺忘變量全球的JavaScript的策略創建 錯誤,可以是非常難以找到。」
除了典型的全局變量常見的危險之外,這些隱含的全局變量的一些問題是什麼?
正如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]
來訪問框架。
全局變量使得很難隔離你的代碼,並在新的上下文中重用它。
Point#1: 如果您有一個Javascript對象依賴於全局變量。您將無法在應用程序中創建此對象的多個實例,因爲每個實例都將更改全局值,從而覆蓋之前由另一個實例寫入的數據。 (當然,除非這個變量保持一個與所有共同的值 - 但更多的時候你會發現這樣的假設是錯誤的)。
Point#2: 全局變量很難將現有的代碼片段重用到新的應用程序中。假設你在一個文件中定義了一組函數,並且你想在其他文件中使用它們(在另一個應用程序中)。因此,您將它們解壓縮到一個新文件中,並將該文件包含在新應用程序中。如果這些函數依賴於全局,則第二個應用將在運行時失敗,因爲全局變量不存在。代碼中不可見對全局變量的依賴,因此忘記這些變量(將函數移動到新文件時)可能會帶來危險。
它們是全局變量,所以,所有的「常見危險」都適用。區別於其他語言的全局變量的主要原因是:
var
,則意外地聲明瞭全局變量。JavaScript使得它非常容易無意識地聲明全局變量;與Scheme相反,如果在全局範圍內未定義變量,則會引發錯誤。window[variable_name]
。這可能令人擔憂。例如,您的一些代碼可能訪問window['foo']
(意在訪問全局變量)。然後,如果您在程序中的其他地方不小心輸入了foo
而不是var foo
,則您已聲明對window['foo']
的引用,這意味着要保持獨立。一個問題是,您可能踐踏已定義的變量並且不知道它,從而在代碼的其他部分造成奇怪的副作用,這可能是追蹤的負擔。
另一個是它只是草率的代碼。你不應該創建比他們需要的範圍更大的變量,因爲至少它會在內存中保留更多的變量,並且最糟糕的是它可以創建你不想要的數據場景。
底線是,當你這樣做時,你不確定你是否搞亂了使用同名全局變量的其他函數。有時它甚至不是你的錯,另一個插件的懶惰程序員留下了一些全球性的東西,這意味着它的功能範圍內。因此,編寫更好,更少錯誤的代碼是非常實用的保障。
典型全局變量的問題在於它們是全球性的 - 沒有範圍來包含它們,並且任何正在執行/與之交互的代碼(例如您稱之爲道路的庫)都可以修改變量而不發出警告。 - 對於唯一的要求是忘了var
關鍵字
然而,這些問題在Javascript中的兩件事情複雜化。
在一個合理的設計語言,包括真正的全局變量(OK,所以不是合理設計的),你將有地方有限的幾個定義全局變量,它需要一個特殊的關鍵字來這樣做。
阿門到#2。我一直在工作中遇到這個問題。我們喜歡全局變量! :( – 2011-02-07 14:49:43