Discuss / JavaScript / module.exports 与 exports 的个人理解

module.exports 与 exports 的个人理解

Topic source

荔透涡儿

#1 Created at ... [Delete] [Delete and Lock User]

是否可以把exports看成是对module.exports的引用呢, 可以用exports.foo往里面增加新的属性, 但是如果直接对exports赋值, exports就不再是module.exports的引用了, 所以moudule.exports仍然为空对象{}... 个人理解?

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

对,其实只需要引用module就可以了,引入exports反而对新手造成困扰

谢谢层主,理解了。

biggerdream

#4 Created at ... [Delete] [Delete and Lock User]

一针见血,厉害了

hiker_hrw

#5 Created at ... [Delete] [Delete and Lock User]

想补充说明下,赋值以后exports就不再是module.exports的引用的原因是如果直接对exports赋值就相当于在load函数里面重新定义了一个新的exports变量,就不再是之前那个指向module.exports的exports变量了。 个人理解

猎杀属性

#6 Created at ... [Delete] [Delete and Lock User]

感谢!

10的世界

#7 Created at ... [Delete] [Delete and Lock User]

纸上得来终觉浅,exports的赋值都当作值传递,只有用exports.xxx才是对象的引用,见截图 引用方式 值传递

Lucio_Lu

#8 Created at ... [Delete] [Delete and Lock User]

楼上说值和引用传递,这是不是因为值传递和引用传递把,这里的实参exports和module都是引用传递把?要不然它们怎么可以指向同一个对象呢?之所以exports={}会出错是因为,2个引用本来指向同一个对象,这时候任何一个引用被重新赋其他值都会导致它们指向不同的对象。

var a = {x:1}

var b=a;

a={};

就像这样。

var a={exports:{}};

var b=a.exports;

也是如此,

不管你修改b,还是a.exports都会导致这2个引用指向不同对象。

那为什么修改a.exports可以,修改b却不行呢?

因为代码最后return的是module.exports呀,

如果代码最后return的是exports,那就反过来,只能对引用exports赋值才有效,对引用module.exports赋值反而无效

OHHOHH121

#9 Created at ... [Delete] [Delete and Lock User]

我觉得这位老哥说得对

何宗苡

#10 Created at ... [Delete] [Delete and Lock User]

我觉得这位老哥说得对 +1


  • 1

Reply