在Javascript中,“binding”是什么意思?

13
我正在阅读一本名为《JavaScript编程精解》的好书,但在这个例子中使用了“binding”一词令我感到困惑:
引号中的代码段是说:我们可以通过在属性名称周围使用方括号来在对象表达式和类中包含符号属性。 这会导致属性名称被计算,就像方括号属性访问符号一样,这使我们能够引用保存符号的绑定。
let stringObject = {
  [toStringSymbol]() { return "a jute rope"; }
};
console.log(stringObject[toStringSymbol]());
// → a jute rope
据我理解(在我的JS之旅中),"binding"与指定函数的上下文或对象上下文有关。请参见此处。绑定可能与上下文相关。这就是为什么我们有 .bind()

但在这个例子中,我们绑定了其他东西(一个键为符号的方法)。binding是否只意味着将属性(原始值或方法)附加到对象上?


3个回答

11

“Binding”在JavaScript中是否只意味着将属性(原始值或方法)附加到对象上?

不是的。

您之前的段落提供了更好的解释:

“绑定”与指定this或对象的上下文有关。

有点是的。

JavaScript跟踪的所有东西都是被绑定的。实际上,undefined的定义意味着JavaScript无法找到一个被绑定的标识符。

答案

在JavaScript中,绑定某个东西意味着将该标识符记录在特定的Environment Record中。每个Environment Record与特定的Execution Context相关联,这将绑定该标识符(变量或函数名称)到该执行上下文的this关键字。

参考资料

https://www.ecma-international.org/ecma-262/5.1/#sec-10.5

非正式的解释

把Environment Records想象成一些桶,这些桶中装有各种东西。它们不是JavaScript中我们编码的对象、函数或变量等,而是包含所有这些东西的桶。在JavaScript应用程序中有许多这样的桶。每个桶都独立于其他桶运行。这种独立性在JavaScript中被表示为上下文(或执行上下文)。但有时候,我们希望在不同的上下文中使用来自一个桶中的东西。这就是绑定的作用。我们可以将来自一个桶的东西绑定到另一个桶的上下文中以执行。 (这样做的一个副作用是this关键字反映了所“借用”东西的桶)。


2
这是很棒的信息,谢谢。不幸的是,《Eloquent Javascript》在第二版到第三版时做出了这个改变。当它像其他资源一样将变量称为_variables时,它是一个非常好的教学工具。对于一个面向经验不足的开发者的书来说,这是一个令人困惑和不必要的改变。这些信息本可以轻松地包含在解释.bind()this等内容的章节中。 - aremay
@reustin 同意。我也是从同样的资源和同样的原因来到这里的,之前学过ES5一段时间,普遍提到绑定的参考资料让我觉得变量在ES6中已经被重命名了。 - Hashim Aziz

7

绑定是JavaScript中一个正式的术语,许多人将其称为变量。在ES2015+中,可以使用let关键字定义变量,也可以使用const关键字定义常量。一个绑定可以指代变量或者常量。

参考:请见《JavaScript编程精解》第2章第1页“绑定”一节(https://eloquentjavascript.net/02_program_structure.html


-2
在这本书中,它们将绑定或变量互换使用。因此,简单地说,绑定就是一个变量。我猜你开始读一本书直接跳过一些页,不要再这样做了。我会写一个非常简单的程序来说明。

let count = 1;//count is a binding(a variable)
++count;//it's called side effect(because the original value of count binding was modified)


1
当前来看,你的回答不够清晰。请进行[编辑]以添加更多细节,以帮助其他人理解如何回答问题。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接