Appearance
CommonJS 导出结果
使用 require() 导入脚本时,会将被导入的脚本放到一个函数中执行,所以 common.js 的脚本是在函数作用域中,也就有 this 和 arguments。
js
console.log(arguments)sh
$ node infunction.js
[Arguments] {
'0': {},
'1': [Function: require] {
...
},
'2': {
...
},
'3': '.../commonjs/infunction.js',
'4': '.../commonjs'arguments 中分别是:exports、require、module、__filename、__dirname,这也是我们可以在 CommonJS 中可以直接使用它们的原因。
js
console.log(arguments[0] === exports)
console.log(arguments[1] === require)
console.log(arguments[2] === module)
console.log(arguments[3] === __filename)
console.log(arguments[4] === __dirname)sh
$ node testArguments.js
true
true
true
true
true导出之前会在这个函数中准备几个变量。
javascript
var module = {
exports: {}
}
var exports = module.exports然后会把 this 绑定到 exports。最终执行这个函数,这个函数会执行被导入代码。最终导出 module.exports。
所以面试题中会出 this、exports、module.exports 来回赋值,不管中间怎么变,最终导出结果就是当前的 module.exports。