node中使用require引入模块会污染全局变量,如何解决呢?

新手第一次使用node自己写模块,发现用require引入的模块中的变量,会污染全局变量(应该是叫这个问题吧)。但是根据定义变量使用的方法不同又有差异。。。下面是例子

//mylog.js
var log = {}; 
abc = 'abc'; //没有使用var定义变量
Date.prototype.Format = function (fmt) {}
module.exports = log;

//example.js
var log = require('./mylib/mylog.js');
console.log(abc); //'abc'
var date = new Date();
console.log(date.Format('yyyy')) //2016

mylog.js中 如果使用 var abc = 'abc'来定义变量,那么example中引入模块后这个变量显示未定义。也就是说require进来的模块有自己的作用域。我把每一个require的模块看成一个独立的函数,且引入的时候会先执行一次。这样理解对吗?
还有一点对于挂载在prototype上的方法,有没有办法让它只作用在模块中呢?虽然这种需求听起来很奇怪。。。

阅读 5k
3 个回答

模块就是一个对象。根据你的问题,考虑一下,如果

function Obj(){
    var abc = 'abc';
    def = 'def';
    this.a = 'a';
}
var obj = new Obj();
console.log(obj.abc);    // undefined
console.log(obj.a);     // a
console.log(def);       // def

显然obj.abcundefined,而def则污染了全局变量。

如何封装你的模块,参考楼上大大@njaulj 的回答~

//mylog.js
module.exports = {
    abc:"abc",
}

//example.js
console.log(abc);//undefined
var log = require('./mylib/mylog.js');
console.log(log.abc); //'abc'

应该这样子导出吧,

abc = 'abc'; //没有使用var定义变量
Date.prototype.Format = function (fmt) {}

你的abc,和prototype 都是改变的全局变量的值;
你可以建个自己的对象封装起来;

log.js

function Log (){
}

Log.prototype.formatDate = function(input){
    //xxxx
    return output
}

module.exports = Log
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题