javascript - ES6 模块 - 为什么命名的 const 导出不是只读的

标签 javascript ecmascript-6 babeljs es6-modules

我去过reading about ES modules并进行实验并偶然发现了一个我无法解释的案例:

// 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;

main1.js 中,我可以通过 settings 变量覆盖 const 值,但在 main2.js 中 我不能(正如预期的那样)。

(理论上的)问题是为什么在第一种情况下可以覆盖 const 值?创建“只读 View ”是否只是在常规对象上创建属性并破坏原始结构?

实际问题是从模块返回一组常量(或只读属性)的最有效方法是什么?我的想法是这样的:

// settings.js
export default Object.freeze({
  FOO: 42,
  BAR: 5
});

有什么想法吗?

编辑:我正在使用 Babel。

最佳答案

另一个答案不正确。

The (theoretical) question is why in the first case it's possible to override the const value?

这实际上完全独立于const。使用 ES6 模块语法,不允许从模块外部重新分配模块的导出值。 export let FOO;export var FOO; 也是如此。代码 inside 模块是唯一允许更改导出的东西。

从技术上讲,执行 settings.FOO = 1 应该会抛出异常,但大多数编译器目前不处理这种特殊的边缘情况。

举个例子,你可以这样做

export var FOO;

export function setFoo(value){
  FOO = value;
}

鉴于此,thisconst 变得有用的时候,因为它与任何其他普通 JS 代码相同。 FOO = value 如果它被声明为 export const FOO 将会失败,所以如果你的模块正在导出一堆常量,执行 export const FOO = 1, FOO2 = 2; 是导出常量的好方法,只是 Babel 实际上并没有使它们不可变。

关于javascript - ES6 模块 - 为什么命名的 const 导出不是只读的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45817410/

相关文章:

javascript - 如何在不通过引用传递该对象的情况下将对象插入数组?

javascript - ReactJS - 从带参数的函数返回未定义的值

javascript - 我使用 ES6 模块以及使用导入/导出语法的 npm 模块的最简单方法是什么?

reactjs - 使用 babel 后,'Symbol' 在 IE 中未定义

Javascript 两次更改类

javascript - html和js代码如何分离?

javascript - ES5 中解构赋值的支持问题

Javascript 6to5(现在是 Babel)导出模块的使用

javascript - 我如何在不更改 window.location 的情况下在 ember.js 中重定向用户

javascript - 如何在不使用 JavaScript (Firefox) 中的 for-in 循环的情况下获取对象的所有属性?