(譯)Node.js的全局變量


原文標題:Global Variables in Node.js
原文鏈接:http://www.hacksparrow.com/global-variables-in-node-js.html

你可能正在使用一些 Node.js 的模塊,或者一個框架比如 Express.js ,並且突然感覺你需要創建一些全局變量。在 Node.js 中你會如何創建全局變量?

在這個問題上,大多數的建議是“不使用 var 聲明變量”,或者是“把變量添加到 global 對象上”,亦或者是“將變量添加到 GLOBAL 對象上”。你選擇哪一個?

首先,讓我們來分析一下這個global 對象。打開一個終端,切換到 Node REPL (prompt)

$ node
>

輸入"global",看看這個對象到底有些什么。

> global

我的天啊(原文:Holy mother of Flying Spaghetti Monster!!!)!這是一個龐大的對象!實際上,你看到了 Node.js 的靈魂。在一個 Node.js 的進程中,所有的其他對象都是依附在 global 對象上。如果你熟悉瀏覽器中的 JavaScript 環境,global 對象和 Window 對象相似。

現在我們知道了 global 對象是什么,現在讓我們來玩弄它:

> global.name
undefined
> global.name = 'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> delete global.name
true
> GLOBAL.name
undefined
> name = 'El Capitan'
'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> var name = 'Sparrow'
undefined
> global.name

有趣的觀察!(Interesting observations!)

看起來似乎 global 和 GLOBAL 是同一個東西。實際上,GLOBAL 是 global 的一個別名。

更讓人驚訝的是:無論是使用 var 聲明的變量還是未使用 var 聲明的變量都添加到了 <codeglobal 對象>global 對象上。在 Node.js 中,不使用 var 關鍵字聲明變量是一種創建全局變量的基本的方法。這種方法在模塊中的實現稍微有些不同,接下來我會解釋。

當你創建了一個 Node.js 進程,在這個進程中的所有模塊都分享同一個 global 對象。結合上面的觀察,你對 global 對象的工作方式有一定的理解。然而,有一點不同之處在於,在你創建的模塊中,使用 var 關鍵字聲明的變量只屬於這個模塊,屬於局部變量。那些未使用 var 關鍵字聲明的變量則附加到 global 對象上。

所以現在你知道了:“不使用 var 聲明變量”,“把變量添加到 global 對象上”和“將變量添加到 GLOBAL 對象上”是相同的事情。

在模塊中全局聲明的變量可以通過它的變量名直接被任何其他的模塊引用,而不用通過 global 對象的引用,意味着:

name == global.name == GLOBAL.name

但是這並不意味着你應該這么做。為什么?看看這個:

var company = 'Yahoo';
console.log(global.company); // 'Google'
console.log(company); // 'Yahoo'

當時使用 gloabal.campany ,你知道你在處理全局變量,此外,在模塊中作為局部變量使用時節約了變量名 campany 。如果你打算在你的 Node.js 程序中使用全局變量,關於 global 對象的方法的討論效果很好。但是,別過度使用全局變量。說了這么多,難道還有不使用全局變量的替代解決方法?

是的,有這么一個,並且它涉及到 module.exports 的使用。讓我用一個例子來證明:

main.js 中的內容:

exports.company = 'Google';
var m = require('./mod');

mod.js 中的內容:

var company = require('./main').company;
console.log(company);

現在來看看它怎么運作的:

$ node main.js
Google

你擁有了一個變量,這個變量來自另一個沒有使用全局對象的可使用的模塊。你可以在其他的模塊中引用 main.js 以此來使用 變量名 campany。

注意:引用一個已經引用了另外一個模塊的模塊,只會創建一個包含前一個模塊的引用,這並不意味着會嚴重增加內存的使用。同時,因為不存在真正的重復包含,模塊中所有的初始化函數都不會重復執行一次。

所以,結論是:在 Node.js 中有兩種創建全局變量的方法,一種是使用 global 對象,另一種是使用 module.export 。我的建議是什么?小應用使用 global 對象,大型應用使用 module.export。

(完)

翻譯水平有待提高,所翻譯的博文並不是按照原文一句一句翻譯,而是添加了自己對文章的理解。如有不正之處,歡迎指正!
個人筆記,僅供參考。

參考:
http://www.hacksparrow.com/global-variables-in-node-js.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM