kru*_*lik 15 javascript ecmascript-6 babeljs es6-modules
我一直在阅读ES模块和实验,并偶然发现了一个我无法解释的案例:
// settings.js
export const FOO = 42;
export const BAR= 5;
// main1.js
import * as settings from './settings';
settings.FOO = 1;
//main2.js
import {FOO, BAR} from './settings'
FOO = 1;
Run Code Online (Sandbox Code Playgroud)
在main1.js我能够const通过settings变量覆盖值,但在main2.js我不能(如预期).
(理论上)问题是为什么在第一种情况下可以覆盖这个const值?创建"只读视图"是否只是在常规对象上创建属性并破坏原始结构?
实际问题是从模块返回常量集合(或只读属性)的最有效方法是什么?我的想法是:
// settings.js
export default Object.freeze({
FOO: 42,
BAR: 5
});
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
编辑:我正在使用巴别塔.
另一个答案是不正确的.
(理论上)问题是为什么在第一种情况下可以覆盖const值?
这实际上完全独立于const.使用ES6模块语法,不允许从模块外部重新分配模块的导出值.用export let FOO;或者也是如此export var FOO;.模块内部的代码是唯一允许更改导出的内容.
从settings.FOO = 1技术上讲,应该抛出异常,但大多数编译器目前都没有处理这种特殊的边缘情况.
举个例子,你可以做到
export var FOO;
export function setFoo(value){
FOO = value;
}
Run Code Online (Sandbox Code Playgroud)
鉴于此,这是const有用的,因为它与任何其他普通的JS代码相同.FOO = value如果它被声明为会失败export const FOO,所以如果你的模块导出了一堆export const FOO = 1, FOO2 = 2;常量,那么导出常量是一种很好的方法,只是Babel实际上并没有使它们成为不可变的.
| 归档时间: |
|
| 查看次数: |
1139 次 |
| 最近记录: |