面试题答案
一键面试区别
- 本质:
exports
实际上是module.exports
的一个引用。在Node.js模块创建时,Node.js会给每个模块内部定义一个module
对象,module.exports
初始是一个空对象{}
,exports
被赋值为module.exports
,即var exports = module.exports = {}
。- 但如果直接给
exports
重新赋值(例如exports = function() {}
),就会切断exports
与module.exports
的联系,因为重新赋值改变了exports
的引用,而module.exports
仍然保持原来的对象。
- 导出方式:
- 使用
exports
导出时,是向exports
所引用的对象添加属性或方法。例如exports.fun = function() {}
,最终导出的还是module.exports
所指向的对象。 - 使用
module.exports
导出时,可以直接重新赋值为一个函数、对象等。例如module.exports = function() {}
,这种情况下,模块导出的就是重新赋值后的内容。
- 使用
示例
- 使用exports导出函数:
// math.js
exports.add = function(a, b) {
return a + b;
};
在其他模块中引入:
const math = require('./math');
console.log(math.add(2, 3));
- 使用module.exports导出函数:
// math.js
module.exports = function add(a, b) {
return a + b;
};
在其他模块中引入:
const add = require('./math');
console.log(add(2, 3));
- 使用module.exports导出对象:
// math.js
module.exports = {
add: function(a, b) {
return a + b;
},
subtract: function(a, b) {
return a - b;
}
};
在其他模块中引入:
const math = require('./math');
console.log(math.add(5, 3));
console.log(math.subtract(5, 3));
- 错误使用exports重新赋值示例:
// math.js
exports = function(a, b) {
return a + b;
};
// 这里虽然对exports重新赋值,但最终导出的module.exports还是初始的空对象
在其他模块中引入:
const math = require('./math');
console.log(math);
// 这里math是一个空对象,因为重新赋值exports切断了与module.exports的联系