深入理解nodejs 中 exports与module.exports
在Javascript 中,有2种作用域,分为 全局作用域 ,和函数作用域,
在 浏览器端 , 全局作用域 就是 window对象的属性,
函数作用域 就是 ,某个 函数 生成的对象的属性;
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script> var name = 'html5'; function Obj(){ this.name = 'CSS3'; } var obj = new Obj(); console.log(obj); console.log(window.name); </script> </head> <body> </body> </html>
上面是代码的运行结果,在使用this 的 时候,要特别注意,因为this 是 在运行时 ,动态绑定某个对象,有诸多的不确定性,可能会产生意想不到的结果。
在nodejs 中,也有2 种作用域,分为 全局作用域 ,和模块作用域,我们一探究竟,将下面保存成test1.js,运行
var name = 'var-name'; name = 'name'; global.name='global-name'; this.name = 'module-name'; console.log(global.name); console.log(this.name); console.log(name);
我们看到 var name = ‘var-name‘;name = ‘name‘; 是定义的局部变量;
而 global.name=‘global-name‘; 是为 全局对象定义一个name 属性,
而 this.name = ‘module-name‘; 是为模块对象定义了一个name 属性
那么我们来验证一下,将下面保存成test2.js,运行
var t1 = require('./test1'); console.log(t1.name); console.log(global.name);
从结果可以看出,我们成功导入 了test1 模块,并运行了 test1的代码,因为在test2 中 输出 了 global.name,
而 t1.name 则是 test1 模块中通过 this.name 定义的,说明this 指向 的是 模块作用域对象。
好吧,我们先来聊一下 CommonJS ,再来 接下来的猜想,
根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。
那么我们来看看在node模块中 exports、module.exports、this
console.log(module.exports === this); console.log(module.exports === exports); console.log(this === exports);
从上面代码执行结果可以看出, 他们都指向同一个对象,
那到底有什么区别,为什么要这么设计,有什么好处,
我们以后来分析,请继续关注。。。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。