簡體   English   中英

ES6模塊 - 為什么命名const導出不是只讀的

[英]ES6 Modules - why named const exports are not read only

我一直在閱讀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;

main1.js我能夠通過settings變量覆蓋const值,但是在main2.js我不能(如預期的那樣)。

(理論上)問題是為什么在第一種情況下可以覆蓋const值? 創建“只讀視圖”是否只是在常規對象上創建屬性並破壞原始結構?

實際問題是從模塊返回常量集合(或只讀屬性)的最有效方法是什么? 我的想法是:

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

有什么想法嗎?

編輯:我正在使用巴別塔。

另一個答案是不正確的。

(理論上)問題是為什么在第一種情況下可以覆蓋const值?

這實際上完全獨立於const 使用ES6模塊語法,不允許從模塊外部重新分配模塊的導出值。 export let FOO;也是如此export let FOO; export var FOO; 模塊內部的代碼是唯一允許更改導出的內容。

settings.FOO = 1技術上應該拋出異常,但是大多數編譯器目前都沒有處理這種特殊的邊緣情況。

舉個例子,你可以做到

export var FOO;

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

並且考慮到這一點, const變得有用的原因,因為它與任何其他普通的JS代碼相同。 如果它被聲明為export const FOO ,則FOO = value將失敗,因此如果您的模塊導出一堆常量,則執行export const FOO = 1, FOO2 = 2; 導出常量是一種很好的方法,只是Babel實際上並沒有使它們成為不可變的。

在這段代碼中

import * as settings from './settings';
settings.FOO = 1;

在上面的代碼中,您不是直接分配常量變量而是分配settings的克隆副本。

import * as settings from './settings';
         ^^^^^^^^^^^^
settings.FOO = 1;

但在下一個代碼中並非如此

import {FOO, BAR} from './settings'
FOO = 1;

這里FOOBAR是常量,你不能分配給它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM