作為一個javascript初學者,都在不知不覺的使用全局變量,用了許久之后,前輩告訴我們不要用去全局變量,然后想盡辦法不使用全局變量,使用模塊化的思路去解決問題。
但是到了nodejs中來,模塊的全局變量只能在模塊用,不能拿到外面去用,當然這是非常好設計,作為天生就能模塊化的封裝,還能有效的隔離各個模塊的耦合,符合我對模塊化的期待。事實上在nodejs的實現代碼中發現,require一個模塊是一個沙箱中執行,簡單的想就是在一個畢包里面執行的,這樣,沙箱外面是無法訪問到。
但是在翻閱nodejs的文檔時,發現有一個global對象,可以用于定義整個runtime時期的全局變量。還是罪惡的來看看怎么使用吧。
module1.js:
module.exports={};
//恥辱的使用了全局變量
global.varA = "abc";
main.js:
var c = require("./calculator");
console.log(global.varA);//使用global對象訪問到"全局"變量
非常丑陋的代碼,很好的反面教材,事實上,在我學習從全局變量轉向的模塊化防止各種全局變量的過程中,我通常使用的是這兒一種方法:
module.exports = (function(){
var _value = 1;//在函數內聲明一個變量,作用域是函數內
return function(){ //返回的一個function能訪問到_value,所以_value并不是global級別的變量,但是可以通過這個接口訪問到
return _value++;
};
})();//一個立即執行的匿名函數
main.js:
var c = require("./module1");

console.log(c());//1
console.log(c());//2一個很好的技巧,從web中的js環境到nodejs環境,屢試不爽。
關于global對象,實際使用中可以省去global. 他是默認的根作用域,相當于web環境中的window對象。
global 對象有幾個挺有用的屬性:
console.log(__dirname);//當前路徑
console.log(__filename);//當前在執行的js文件路徑
//global.process 獲取當前的Process實例
global對象的文檔:http://nodejs.org/api/globals.html