导入值与其导出值是否断开连接,是否仍然是只读的
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 b
或export default 1
),相应的导入将与该导出值断开连接。考虑到这一点,这样的导入仍然是只读的吗?就是说,我可以重新分配a
或c
吗?
导入绑定始终是只读的,参见规范中的抽象CreateImportBinding
操作,步骤5:
- 在envRec中为N创建一个不可变的间接绑定,该绑定引用M和N2作为其目标绑定,并记录该绑定已初始化。
(我强调)
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?
No, c
为只读。
在评论中,你说:
记住它们不是变量是有用的,它们是绑定。虽然变量是一种绑定,但并不是所有的绑定都是变量(即使在ES5和更早的版本中也是如此)。但是当不再存在活绑定时,将这些变量设置为只读是没有意义的
关于它们在无关紧要的情况下是只读的,请记住涉及到两层绑定:
- 源模块中导出的动态绑定。
- import在消费模块中的动态绑定。
当#1的值不变时,为了使#2可写,导入机制必须知道这一点,但该信息不在模块的导出中。导出只给出导出绑定的名称。
此外,拥有可变导入绑定和不可变导入绑定更难以理解,实现起来也更复杂。(从样式的角度来看,重新分配导入的绑定也是令人困惑的。)
同样重要的是要记住,它们是活动绑定的事实意味着import 的值可能会改变。假设: 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.js
的foo
是mod1.js
的foo
的活绑定,mod2.js
看到了这个变化
相关文章:
- 将脚本缓存到本地存储的basket.js概念仍然是一个好主意吗
- 如何知道javascript for语句中的所有结果是否都是错误的
- 是否仍然需要document.getElementById('id')或$('#id'
- arguments.callee是否仍然可以安全使用,或者是否有更好的选择
- 如果数据的格式略有损坏,是否仍然可以确定其文件类型
- 浏览器仍然是单线程的吗
- 检查谷歌地图是否仍然可用
- 检查输入是否都是数字html javascript
- 打字.当使用“三重斜线”时,是否仍然需要三重斜线参考;从“进口”;
- 重新审视网站优化的经验法则:JavaScript在现代浏览器中仍然是必不可少的
- Javascript;HTML文件API-基于文件对象的javascript对象是否仍然包含文件'的位置
- 是否仍然存在获取Rest服务调用以返回纯字符串的方法
- 在提交表单和显示消息之前,如何检查表单输入是否全是数字
- 如何在不包括当前日期的情况下检查日期是否不是过去
- 检查字符串中的字符是否都是唯一的
- 调整图像大小以使其完美地适合幻灯片,问题仍然是用 for 循环将 CSS 代码替换为我的图像
- 如果元素显示:无;在媒体查询中,它们是否仍然加载
- 持续时间为零的css转换是否仍然是硬件加速的
- 导入值与其导出值是否断开连接,是否仍然是只读的
- 如果文件是本地加载的,那么IE中的动态脚本执行顺序是否仍然不可靠