2016-01-23 51 views
2

Node.js似乎使用不同的規則將變量附加到global對象,無論這是在REPL還是在腳本中完成的。關於Node.js中的全局變量

$ node 
> var a = 1; 
undefined 
> a 
1 
> global.a 
1 
> a === global.a 
true 

如圖中REPL工作時,聲明一個變量與上面var創建與global對象上該變量的名稱的新屬性。

然而,這似乎並沒有在腳本的情況:

// test.js 

var a = 1; 
console.log(a); 
console.log(global.a); 
console.log(a === global.a); 

讓我們運行腳本:

$ node test.js 
1 
undefined 
false 

這究竟是爲什麼?

回答

5

當腳本運行時,它被包裝在一個模塊中。腳本中的頂級變量位於模塊函數內部,不是全局變量。這是node.js如何加載和運行腳本,無論是在初始命令行上指定還是使用require()加載。

在REPL中運行的代碼不包含在模塊函數中。

如果您希望變量是全局變量,請將它們專門分配給global對象,這可以在腳本或REPL中使用。

global.a = 1; 

全局變量通常在node.js中被忽略。相反,通過模塊構造函數或其他模塊方法傳遞對它們的引用,需要在特定模塊之間共享變量。


當加載在node.js的一個模塊,該模塊的代碼被插入到一個函數包裝這樣的:

(function (exports, require, module, __filename, __dirname) { 
    // Your module code injected here 
}); 

因此,如果在頂層聲明變量a模塊文件,代碼最終會被node.js中這樣執行:

(function (exports, require, module, __filename, __dirname) { 
     var a = 1; 
}); 

從這裏,你可以看到a變量實際上是一個地方變量在模塊函數包裝器中,不在全局範圍中,所以如果你想在全局範圍中使用它,那麼你必須將它分配給全局對象。

+0

足夠清楚,我使用。 –

0

Node.js中沒有window,但有另一個最高的對象叫做global

無論您在一個模塊中指定給global.something的任何內容都可以從另一個模塊訪問。

例子:

app.js

global.name = "myName" 

現在你可以從任何模塊

得到myController的的global.name。JS

console.log(global.name); // output: myName 

anotherModule.js

console.log(global.name); // output: myName 

現在當你在一個模塊聲明一個變量var i=0;是它可在所有的模塊?不!

因爲您的所有項目代碼都被包裝在模塊下,所以在REPL上它沒有。這是最高的水平。這就是爲什麼REPL變量變成全局的原因。

所以如果你想用全局的工作,你必須與global前綴

global.a = 1; 
console.log(global.a);