对于一个模块而言,有两个关键的地方,一是有自己的作用域,二是有对外暴露的接口
不知道大家有没有想过这样一个问题,模块是怎么实现上面两个特性的呢?其实通过一个 立即执行函数 就可以了
实际上 Node 在编译的时候,会在我们写的代码外包上一层立即执行函数,并传入一些必须的参数
exports
:用于导出模块数据,module.exports
的一个引用require
:用于导入其它模块module
:包含当前模块的基本信息__filename
:当前模块的绝对路径__dirname
:当前模块所在目录的绝对路径
(function (exports, require, module, __filename, __dirname) {
/* 我们写的代码 */
})()
我们上面使用的 require
、exports
都是在编译时传入的,我们可以把传入的参数打印出来看一下
// 打印
console.log(__filename)
console.log(__dirname)
console.log(exports)
console.log(module)
console.log(require)