在node.js中我们可以通过exports和module.exports来导出方法.却不可以直接给exports赋值,很多文章只是说明了会切断了与module.exports连接.
可是很好奇怎么会切短连接,怎么exports就指向了别的地址.
下面是自己的一点理解,如有错误,欢迎留言指正.
先从为什么可以通过exports和module.exports来导出方法说起,见以下代码:
这是自己看传智播客中的摘录:
// 定义一个函数,该函数需要接收一个参数,参数暂时就解析路径就可以了
function myRequire(path) {
function Module() {
this.exports = {};
}
// fs模块是Node.js原生提供的一个用于文件操作的一个模块
var fs = require('fs');
// 表示读取并获得一个文件中的内容, 实际上就是源代码字符串,是string类型
var sourceCode= fs.readFileSync(path, 'utf8');
// 头尾包装,获取代码字符串,代码内容如下:
var packSourceCode = '(
function(exports,module){
'+sourceCode+';
return module.exports;
})';
var packObj = eval(packSourceCode);//执行代码头尾包装后的代码
// 实例化一个Module 有一个exports属性
var module = new Module();
//将module对象的exports属性以及module对象本身作为参数传递进去
var obj = packObj(module.exports,module);
return obj;//即return module.exports(实例化module里的exports)
}
var obj = myRequire('./foo.js');//给myrequire传参,因此上面的this指的就是foo.js模块,this.exports就是指foo.js文件里的moudule.exports,会执行它对应的函数,输出变量值。
obj();
foo.js:
....
exports.foo = 'bar';
module.exports=’1’;
......
个人理解:
foo.js中是exports代表的是一个形参,如果我们直接给形参赋值,那么就会在全局作用域定义一个exports变量,不管我们怎么给exports赋值,他的作用域都是全局.而当执行函数时候,return module.exports返回是实参的值,而不是exports,全局作用域里的export变量是返回不到的.