-
Notifications
You must be signed in to change notification settings - Fork 65
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ES6模块和CommonJS模块有哪些差异? #43
Comments
ES6模块是引用,重新赋值会编译报错,不能修改其变量的指针指向,但可以改变内部属性的值; |
ES6
CommonJS
|
照抄阮大神的书
上面的代码说明,lib.js模块加载后,它的内部变化就影响不到输出的mod.counter 了。
ES6模块的运行机制与CommonJS不一样。JS引擎对脚本静态分析的时候,遇到模块加载命令import就会生成一个只读引用。等到脚本真正执行的时候,再根据这个只读引用到被加载的模块中取值。因此,ES6模块是动态引用,并且不会缓存值,模块里的变量绑定其所在的模块。
上面的代码说明,ES6模块输入的变量counter是活的,完全反应其所在模块lib.js内部的变化。
上面的代码表明,ES6模块不会缓存运行结果,而是动态地去被加载的模块取值,并且变量总是绑定其所在的模块。
main.js 从 lib.js 输入变量obj,可以对obj添加属性,但是重新赋值就会报错。因为变量obj指向的地址是只读的,不能重新赋值,这就好比main.js创造了一个名为obj的const变量。
这就证明了x.js和y.js加载都是C的同一实例 摘抄自: |
ES6是只读的 主要阐述CommonJS吧 之前面试遇到过这个题 CommonJS:
复杂数据类型属于浅复制
|
1.
|
CommonJs模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化不会影响到这个值
你可以看到明明common.js里面改变了count,但是输出的结果还是原来的。这是因为count是一个原始类型的值,会被缓存。除非写成一个函数,才能得到内部变动的值。将common.js里面的module.exports 改写成
这样子的输出结果是 1,2,2
ES6模块是动态引用,并且不会缓存,模块里面的便令绑定其所在的模块,而是动态地去加载值,并且不能重新复制 另外还想说一个
|
commonJS是require()方法 相当于值的拷贝 import 是声明时暴漏的接口 只有在使用时才会去根据这个接口取值 没有属性缓存 对复杂数据类型来说 export default值 也会受到改变 而基本数据类型不会 |
还是峰哥牛批 |
No description provided.
The text was updated successfully, but these errors were encountered: