node.js中的exports和module.exports

在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变量是返回不到的.

猜你喜欢

转载自www.cnblogs.com/qiu-freedom/p/9138942.html
今日推荐