a.js
let num = 1
function add(){
console.log(num);
++num
console.log(num);
}
module.exports = {num,add}
b.js
let {num,add} = require('./a')
console.log(num);
add()
console.log(num);
node b.js
运行结果是1,1,2,1
疑问点:
如果在a里执行add()函数,外部的num会变成2
在b里执行add()函数,内部输出的num是2了,外部的不变,这是为什么呢?
情况1,在 a.js 中执行,结果是 1 1 2 2,这个跟普通函数的执行结果是一致的,add() 函数找不到 num 这个标识符,就会上溯作用域链尝试从祖先作用域查找,因为在 a.js 这个模块作用于中有且仅有一个 num 标识符,所以这个 num 是被共享的,换而言之所有关于 num 的读写操作都是统一的,你可以简单的把 a.js 当作一个函数局部作用域或区块作用域辅助理解,在 a.js 中代码实际效果如下:
情况2,在 b.js 中执行,CJS 的模块本质是一个 Module 实例对象,module.exports 导出的实际上是一个 JS 对象,也就是将 num 的值赋值给导出的对象的一个同名属性 num,在 b.js 中代码实际效果如下: