module.exports与exports的关系和区别

module.exports与exports的关系和区别

在Node中,很多新手都会有一个疑惑,module.exports和exports到底什么关系呢?实际上我们该用哪一个呢?

理想情况下,我们只要赋值exports即可:

exports = function(){
    //code
}

但是通过上面代码,我们通常都是得到一个错误的结果。这是因为exports对象是通过形参的形式传入的,直接赋值的话可能会改变形参的引用,并不能改变作用域外的值。

接下来我们来举个例子:

var a = {
  color: "white"
};
var b = a;

console.log(a);//{ color: 'white' }
console.log(b);//{ color: 'white' }

b.color = "red";

console.log(a);//{ color: 'red' }
console.log(b);//{ color: 'red' }


b = {
  name: "test"
};

console.log(a);//{ color: 'red' }
console.log(b);//{ name: 'test' }

在这里b是对a的引用,它们都指向同一块内存,因此改变了b的属性等于改变了a的属性。再者,我们通过赋值为b = {name: “test”}以后,发现b指向了一块新的内存,因此两者输出的都不一样了。

通过上面例子,这也就不难发现为什么我们用exports 和 module.exports会有出入。

总结起来,exports 和 module.exports 二者的关系:
module.exports 初始值为一个空对象 {},而exports为指向module.exports 的引用,同时在require() 的时候,返回的是 module.exports 而不是 exports,因此,直接赋值exports常常会出现错误,而赋值为module.exports常常是解决这一问题的折中办法。

另外,我们也经常看到这样的写法:

exports = module.exports = xxx //code

即:

module.exports = xxx //code
exports = module.exports;

这种办法的实现其实就是赋值module.exports后不忘把exports也同时指向这块新内存了。即module.exports指向新对象以后,exports断开了对module.exports的引用,后面的做法主要是让exports重新指向module.exports。

猜你喜欢

转载自blog.csdn.net/qq_30879415/article/details/55006817