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

查看:104
本文介绍了javascript - 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上的方法,有没有办法让它只作用在模块中呢?虽然这种需求听起来很奇怪。。。

解决方案

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

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 的回答~

这篇关于javascript - node中使用require引入模块会污染全局变量,如何解决呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆