javascript - node中使用require引入模块会污染全局变量,如何解决呢?
怪我咯
怪我咯 2017-04-11 09:59:54
[JavaScript讨论组]

新手第一次使用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上的方法,有没有办法让它只作用在模块中呢?虽然这种需求听起来很奇怪。。。

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(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'

应该这样子导出吧,

PHPz
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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号