簡體   English   中英

與其導出值斷開連接的導入值是否仍為只讀?

[英]Are import values disconnected from their export values still read-only?

給出了以下模塊結構:

// module A:
export let a = 1; // named export
export function inc() { a++; } // named export

// module B:
let b = 1;
export default b; // default export (equivalent to `export default 1`)
export function inc() { b++; } // named export

// module C:
let c = {};
export default c; // default export

// module E:
import a, {inc as incA} from "./A";
import b, {inc as incB} from "./B";
import c from "./C";

incA();
console.log(a); // logs 2, because "a" has a live connection to the export value
a++; // Error (because a is a live read-only view on the export)

incB();
console.log(b); // logs 1, because "b" is disconnected from the export value
b++; // Does this throw an error as well?

c.prop = true; // I think mutations are always allowed, right?
c = {}; // but are reassignment allowed too?

如果我有一個表達式的默認導出( export default bexport default 1 ),則相應的導入與此導出值斷開連接。 考慮到這一點,這樣的導入是否仍然是只讀的,也就是說,我可以重新分配ac嗎?

導入綁定始終是只讀的,請參閱規范中的抽​​象CreateImportBinding操作,步驟 5:

  1. envRec 中N創建一個不可變的間接綁定,引用MN2作為其目標綁定,並記錄綁定已初始化。

(我的重點)

該操作由ModuleDeclarationInstantiation在處理模塊的導入條目時使用。

所以:

 b++; // Does this throw an error as well?

是的, b是只讀的。

 c.prop = true; // I think mutations are always allowed, right?

如果導出的對象允許,是的。

 c = {}; // but are reassignment allowed too?

不, c是只讀的。


在評論中,您曾說過:

但是當不再有實時綁定時,將這些變量設為只讀是沒有意義的

記住它們不是變量是有用的它們是綁定 雖然變量是一種綁定,但並非所有綁定都是變量(即使在 ES5 及更早版本中)。

關於它們在無關緊要的情況下是只讀的,請記住,涉及兩層綁定:

  1. 源模塊中導出的實時綁定。
  2. 消費模塊中導入的實時綁定。

為了在 #1 中的值不會改變時使 #2 可寫,導入機制必須知道這一點,但該信息不在模塊的 exports 中 導出只給出導出綁定的名稱。

此外,具有可變導入綁定和不可變導入綁定更難理解,更難實現。 (從樣式的角度來看,重新分配導入的綁定也是令人困惑的。)

同樣重要的是要記住,它們是實時綁定的事實意味着導入的值可能會改變 假設:

mod1.js

export let foo = 41;
export function incrementFoo() {
    ++foo;
};

mod2.js

import { foo, incrementFoo } from "./mod1.js";
console.log(foo); // 41
incrementFoo();
console.log(foo); // 42 <== it changed

在這種特殊情況下,是mod2.js中的代碼導致了更改(通過調用incrementFoo ),但並非必須如此。 可能是因為在mod1.js發生了一些與時間相關的事件來改變值,或者其他模塊調用mod1.js等。

但由於mod2.jsfoo是一個活生生的結合mod1.jsfoomod2.js看到的變化。

暫無
暫無

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

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