Skip to content

CommonJS 导出结果

使用 require() 导入脚本时,会将被导入的脚本放到一个函数中执行,所以 common.js 的脚本是在函数作用域中,也就有 thisarguments

js
console.log(arguments)
sh
$ node infunction.js
[Arguments] {
  '0': {},
  '1': [Function: require] {
     ...
  },
  '2': {
     ...
  },
  '3': '.../commonjs/infunction.js',
  '4': '.../commonjs'

arguments 中分别是:exportsrequiremodule__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

所以面试题中会出 thisexportsmodule.exports 来回赋值,不管中间怎么变,最终导出结果就是当前的 module.exports

最后更新于: