论commonjs中exports, module.exports, this的区别

18 阅读1分钟

1. exportsmodule.exports的区别

我们来看下嘛这段关系

console.log(exports === module.exports); // true

如上所示这两者是相同的, 那他是怎么相同的,再看下面的的代码

module.exports.a = 1;
exports.b = 2;

console.log(exports); // { a: 1, b: 2 }
console.log(module.exports) // { a: 1, b: 2 }

如上所示 exportsmodule.exports是指向同一块内存的

2. thisexports, module.exports的区别

首先,我们要指出一个观点, commonjs的代码最后是在一个function函数环境来指向执行的,为了验证此观点, 我们做个测试

console.log(arguments.length); // 5

由此可见, 我们的commonjs的代码是在function函数环境执行的, 然后再看thisexports, module.exports的区别

console.log(exports === module.exports); // true
console.log(exports === this); // true
console.log(module.exports === this);  // true

如上代码可见他们是相同的, 即内存指向是相同的, 但是具体是怎么相同的呢, 众所周知, 让this和变量的执行一样的方法有两个, call和apply, 那根据上面得到的commonjs代码是在function函数环境执行的结论, 那就是执行commonjs代码的这个函数在执行时使用call或者apply将this指向了export或者说module.exports

3. commonjs模块导出的到底是什么内容呢?

exports = {
    a: 1
}

module.exports = {
    b: 2
}

this.a = {
    c: 3
}
const test = require('./common-test');

console.log(test); // { b: 2 }

如上所示可以得到commonjs真正导出的是module.exports的代码