作为一个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