今天学习,看到妙味视频里讲module.exports和exports指向的是一个对象,区别是exports是全局的,于是就想到那不是所有模块暴露出的变量都可以在某个模块引入后被访问到了,于是自己敲代码试一试,结果并!不!是!
辟谣2点:
1.module.exports和exports指向的确实是一个对象。
2.不存在如果module.exports执行以后,所有的exports方法都将失效。
==================================================================================================================================
两个文件2.js和hello.js,后者引用前者:
requ.js的代码:
var b='re 的 b'; exports.b=b;test.js代码:
/** * Created by Administrator on 2017/4/26. */ var exp=require('./requ');//require返回了每个module的exports对象,这个对象要接收了之后再访问!!! //全局的exports对象和每个模块的module.exports //你在这个模块里写exports和module..exports都是当前这个模块的exports //是用来给别的模块暴露数据的exports,而不是接收来的。 console.log(exports.b);//undefined //当前模块的还没加入b属性,在当前对象中的exports不是你接收来的哇 console.log(exp.b);//2 de b //这个exp是从2.js接收来的,人家2.js暴露了不,这里当然有b console.log("=======测试module.exports和exports是否指向同一个对象========"); module.exports.age=[1,2,3]; console.log(exports);//输出:{ age: [ 1, 2, 3 ] } //可见就是指向同一个 console.log("=======测试module.exports先执行后,exports是否还有效========"); module.exports.name=[1,2,3]; exports.name=[1,2,3,4]; console.log(module.exports.name);//[ 1, 2, 3, 4 ] console.log(exports.name);//[ 1, 2, 3, 4 ] //exports在module.exports之后修改属性有效。输出结果:
"D:\WebStorm 9.0.3\bin\runnerw.exe" "C:\Program Files (x86)\nodejs\node.exe" hello.js
undefined
2 的 b
=======测试module.exports和exports是否指向同一个对象========
{ age: [ 1, 2, 3 ] }
=======测试module.exports先执行后,exports是否还有效========
[ 1, 2, 3, 4 ]
[ 1, 2, 3, 4 ]
=================================================================
下面解释辟谣2.不存在如果module.exports执行以后,所有的exports方法都将失效。
网上的代码是:
创建一个rocker.js:
第一个代码中的
===================================================================================================================================
exports再怎么变,也是因为指向和module.exports相同的对象,所以改变了module.exports的值(从这个意义上来说,网上有些说exports是“辅助”,也是有点道理的)