我最近在 Kyle Simpson 的《你不知道的 JS:ES6》中阅读了以下内容
[ES6 模块导出] 实际绑定(bind)(几乎像指针)到内部模块定义中的标识符。”
我的困惑是这些绑定(bind)与引用有何不同...
我明白 JS 中的 reference 只适用于非原始类型(比如对象),所以给定
let object1 = {a: 1};
let object2 = object1;
object1
和 object2
现在引用(它们都是引用)同一个对象。
如果我向 object2
添加一个属性,我也会向 object1
object2.b = 2;
console.log(object1.b); // 2
而且我可以看到绑定(bind)可以应用于原始类型和非原始类型
// foo.js
export let count = 1;
export function incrementCount() { count++; }
// bar.js
import {count, incrementCount} from foo;
console.log(count); // 1
incrementCount();
console.log(count); // 2
除了原始值也可以共享一个绑定(bind)(而引用仅限于非原始类型)之外,绑定(bind)是否就像引用一样?
我觉得我在这里错过了什么......
最佳答案
A binding是“名称指的是什么”的非常通用的术语。作用域中的每个标识符都绑定(bind)到某物。通常它们解析为变量环境中的变量(environment record 中的存储槽),但也有异常(exception)(例如 with
或全局对象)。
A reference是指向某种结构的指针的术语。例如,对象被称为“reference values”,因为它们引用具有标识的可变属性的容器。
ES6 模块现在引入了一种新的绑定(bind)类型,一种以前不为人知的类型。它不是一个普通的变量,而是字面上对另一个变量的引用——从另一个模块导出的变量。如果模块变量发生变化,这将通过导入反射(reflect)出来——它们都指向同一个环境记录槽。
export
声明添加了从本地名称到 module interface 中的名称的映射。 ,而 import
声明添加了从相应模块接口(interface)中的名称到本地名称的映射。当一个模块被实例化时,一个 indirect binding is created指向与导出模块中的本地绑定(bind)相同的环境。
关于Javascript 引用与绑定(bind)……有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259729/