5 javascript ecmascript-6 es6-modules
给出以下模块结构:
// 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?
Run Code Online (Sandbox Code Playgroud)
如果我有一个表达式(export default b
或export default 1
)的默认导出,则相应的导入将与此导出值断开连接.考虑到这一点,这样的导入仍然是只读的,即我可以重新分配a
还是c
?
导入绑定始终是只读的,请参阅CreateImportBinding
规范中的抽象操作,步骤5:
- 在envRec中为N创建一个不可变的间接绑定,它引用M和N2作为其目标绑定,并记录绑定的初始化.
(我的重点)
ModuleDeclarationInstantiation
处理模块的导入条目时使用该操作.
所以:
Run Code Online (Sandbox Code Playgroud)b++; // Does this throw an error as well?
是的,b
是只读的.
Run Code Online (Sandbox Code Playgroud)c.prop = true; // I think mutations are always allowed, right?
如果导出的对象允许,是的.
Run Code Online (Sandbox Code Playgroud)c = {}; // but are reassignment allowed too?
不,c
是只读的.
在评论中,你说过:
但是当不再有活动绑定时,将这些变量设为只读是没有意义的
记住它们不是变量,它们是绑定是有用的.虽然变量是一种绑定,但并非所有绑定都是变量(即使在ES5和更早版本中).
关于它们在无关紧要时是只读的,请记住涉及两层绑定:
为了在#1的值不会改变时使#2可写,导入机制必须知道,但该信息不在模块的导出中.导出只是给出导出绑定的名称.
此外,具有可变的导入绑定以及不可变的导入绑定更难以理解并且实现起来更复杂.(从样式的角度来看,重新分配导入的绑定也会让人感到困惑.)
归档时间: |
|
查看次数: |
1287 次 |
最近记录: |