变量声明与变量绑定相同吗?

2024-01-28

MDN 文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let状态:

let 绑定是在包含的(块)范围的顶部创建的 该声明通常称为“吊装”。与变量不同 用 var 声明,它将以值 undefined 开头,让 变量在其定义被求值之前不会被初始化。 在初始化之前访问变量会产生 参考错误。该变量位于“临时死区” 块的开始,直到处理初始化。

Is the "let绑定”提到(吊装let and const)只是关键字let,或者只是创建存储空间(与关键字无关)?

以前我认为变量关键字和变量名一起组成了一个声明,但是在一个question https://stackoverflow.com/questions/50895174/initialization-vs-assignment我最近问过,回答者说它们实际上是初始化。


我很抱歉在编写该 MDN 段落时使用了两个不同的术语。出于该文章中的所有目的,“变量”和“绑定”应理解为同一事物。但让我们详细讨论一下。

A 变量声明 https://en.wikipedia.org/wiki/Declaration_(computer_programming)创建变量(作为抽象实体)。它告诉编译器应该引入一个新变量,并且还可以告诉它名称、要保存的类型、初始值、范围等(取决于语言)。在 JS 中,有不同类型的声明来做不同的事情,例如

  • var有一个名称、一个可选的初始化程序和特定于的范围规则var
  • function有一个(有时是可选的)名称,该值始终是给定的并且已知是一个函数
  • const有一个名称,一个必需的初始化程序,应该是不可变的,并且具有词法范围

A binding https://en.wikipedia.org/wiki/Name_binding是变量名称与变量实体的关联,例如“x引用声明的变量class x“。这样的绑定取决于范围,即在每个不同的范围中都有不同的绑定,因此标识符x可能指的是不同的things在不同的范围内。
考虑到 JavaScript 的作用域规则,变量声明还会导致在各自的作用域中创建其自身的绑定。

因此,绑定使得名称可供使用。这就是我所说的“the let绑定是在范围的顶部创建的“。它与变量的存在、为其分配内存或正在初始化无关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

变量声明与变量绑定相同吗? 的相关文章

随机推荐