【问题标题】:Initialization vs assignment初始化与分配
【发布时间】:2018-11-26 10:56:35
【问题描述】:

术语“初始化”和“赋值”似乎可以互换使用。我做了一些搜索,似乎在技术上可能存在差异。我的理解是,在变量的上下文中,变量在 JavaScript 引擎使其可供使用和赋值时被初始化(无论是显式完成 [如let foo = 1;] 还是由 JavaScript 引擎完成,如下例所示)是实现这一目标的一种方法。

let foo;
console.log(foo); // undefined (initialization and assignment?)

我的理解正确吗?另外(如果是这样),在初始化期间实际发生了什么以使变量可用?

【问题讨论】:

  • 你混淆了声明和初始化。第一个任务是初始化。声明使变量可用。
  • 初始化和赋值不一样。初始化创建变量引用的内存内容。赋值只是让一个变量引用一些内存。
  • 绑定是对 let 和 const 的提升——这和声明是一样的吗? (我认为关键字和变量名组成了一个声明)

标签: javascript computer-science


【解决方案1】:

TLDR:

{ // declaration (hoisted)
  // Temporal deadzone
  let foo; // declaration and initialization to undefined
  foo = 1; // assignment
}

再长一点:

声明

声明一个变量意味着我们在当前范围内保留标识符。在javascript中声明被提升,这意味着它在变量所在的范围变得可见时被声明(它所在的块被执行)。但是,您现在无法访问该变量,因为它在

The temporal deadzone

这是代码的特定部分,位于作用域开始和初始化之间。尝试在此处访问变量会导致错误。

初始化

初始化发生在你声明变量的那一行。它将为变量分配一个值,并使其可供访问。例如:

let foo;

foo初始化为undefined

let foo = 2;

foo初始化为2

作业

...只是意味着您更改了变量的值。 javascript 中的所有分配都使用=。初始化基本上只是第一个assinment。

上面的解释不适用于用var声明的变量,所以不要使用var以免混淆:)

【讨论】:

  • @stefan 部分是的,我上面描述的不适用于var,但letconst 被提升了。 stackoverflow.com/questions/33198849/…
  • 对不起。我再次阅读了 MDN 页面。看起来我对 let 语句有一个误解,这让我认为它们没有被提升。 ?
  • @stefan 别担心,不同的人用不同的语言用不同的词来描述基本相同的东西,我经常感到困惑......
  • const 和 let 的提升只是在相关作用域的顶部创建绑定(存储空间)吧?但你是说声明被提升了......声明关键字(如“let”)?还是只是绑定(与关键字无关)?
  • @natalie 只是绑定,声明关键字(let 或 const)然后标记初始化
猜你喜欢
  • 2020-07-18
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多