Javascript 引用与绑定(bind)……有什么区别?

标签 javascript reference ecmascript-6 es6-modules

我最近在 Kyle Simpson 的《你不知道的 JS:ES6》中阅读了以下内容

[ES6 模块导出] 实际绑定(bind)(几乎像指针)到内部模块定义中的标识符。”

我的困惑是这些绑定(bind)与引用有何不同...

我明白 JS 中的 reference 只适用于非原始类型(比如对象),所以给定

let object1 = {a: 1};
let object2 = object1;

object1object2 现在引用(它们都是引用)同一个对象。
如果我向 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/

相关文章:

javascript - HTML 和 JS 中不同的字符串表示

Javascript - 将带有参数的函数添加到 addEventListener 会导致该函数触发

ecmascript-6 - es6 导入 'destructuring' 不工作

javascript - 通过 ES6 中的项键减少数组

javascript - 使用 Perl 提取脚本类型 html/text

javascript - jQuery for 循环与数组(计数数组)

javascript - 谷歌脚本语法

python - 如何从不同的子模块导入一个子模块?

ruby-on-rails - Ruby on Rails 基本概念总结

c++ - Codepad.org C++ 代码给出了错误的结果