2016-05-29 20 views
0

考慮下面的代碼,聲明使用var關鍵字文件範圍變量:如何使用數組表示法訪問使用'var'聲明的文件範圍變量?

// File a.js 

var foo = "Hello, foo!"; // I know I can remove 'var', but that's not what I'm asking 

logVar("foo"); 

function logVar(name) { 

    var text = global[name]; // 'global' does not work to access 'foo'!!! 

    console.log(text); 
} 

我想知道如何使用數組表示法(訪問文件範圍的變量foo即給定的文本變量名稱 - 如global["foo"],正如註明不起作用)。

我剛剛花了大約一個小時尋找這個;即here,herehere。很顯然,通過在文件範圍內使用var foo = ...語法(而不是僅在foo = ...),該變量不會出現在global範圍內,而是出現在節點爲包裝文件而創建的文件的閉包範圍內。

現在,我知道我可以從變量聲明中刪除var。但這不是我要問的。

我想知道是否有可能訪問文件範圍變量聲明var使用數組表示變量名稱的文本字符串。

這是可能的節點?如果是這樣,怎麼樣?

+2

我想說這是不可能的。你可以在全局範圍內做到這一點,因爲全局範圍的詞彙環境可以作爲一個綁定(全局範圍是一件非常特殊的事情),但我懷疑這是爲模塊範圍提供的。 – MinusFour

回答

0

節點中有一個全局對象,名稱爲global,但它不包含您聲明的變量,除非您省略關鍵字var。您可以將其聲明爲foo = "hello"並使用global["foo"]進行訪問。但是,要非常小心地聲明全局變量。如果您必須擁有全局狀態,最好將其全部保存在一個對象中,以便所有全局變量都在同一個位置,並且不會混亂命名空間。例如,

var globalVars = { 
    foo: "hello" 
}; 

console.log(globalVars["foo"]); 

如果你不這樣做,這樣一來,奇怪的東西,可能會發生這樣global["console"].log()。將全局狀態置於一個全局對象內是一種更有組織的方法。