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
。