📜  什么是 ES6 中的时间死区?

📅  最后修改于: 2022-05-13 01:56:42.182000             🧑  作者: Mango

什么是 ES6 中的时间死区?

简介:在开始之前,先想想这三个字在说什么? Temporal 表示暂时的,而不是永久的,Dead 表示不工作的东西,或者可以说它处于无生命状态,Zone 表示一个区域,但我们正在编程,所以这个术语区域将与内存或区域有关可以认为是时间段或阶段。因此,合并这些术语说明某些实体暂时处于无生命或不活动状态,不能用于任何类型的工作。您应该了解 javascript 中的 let 和 const 关键字,以便轻松理解该主题。

为什么存在时间死区?

这个问题可能会出现,它们不在早期的 javascript 中,那么我们为什么需要它们,以及为什么 ECMAscript 在新更新中引入了这个额外的东西,实际上在分配值之前访问变量的程序是不好的,好吧,假设 javascript 给了一些空间内存中的变量只是因为有一个特定的原因你可能会在那里存储一些数据,那么为什么要在实际放置之前提取这些数据。大多数编程语言在这种情况下都有不同的配置,比如 C++ 在初始化之前存储垃圾, Python变量甚至在初始化之前都不会被创建, Java存储一个默认值。
因此 javascript 具有未定义但由于变量的内存分配阶段提升发生并且在线程执行阶段我们可以访问它们,因此,该值显示为未定义。后来引入letconst时,它们对访问有一些限制,只是为了帮助 javascript 开发人员编写好的代码并简化调试,因此出现了临时死区的新概念,它帮助我们捕获错误,因为在提供之前访问了一些数据是错的。这是一种语言结构,可以让我们避免许多意外错误。

现在让我们用不同的例子来理解。

示例 1:在此示例中,我们只是使用 javascript 代码片段并使用 var 关键字来查看内存分配是如何发生的。

index.js


index.js


index.js


main.js


输出:

解释:

  1. 首先将创建全局执行上下文。
  2. 然后内存分配阶段开始,在此期间,变量 x 在内存中占有一席之地,javascript 将 undefined 放在那里。
  3. 然后线程执行阶段开始,在这个console.log(x)语句执行并打印存储在x中的值,这是未定义的。
  4. 在下一行中,x 被赋值为 6,x 的未定义值被 6 替换。
  5. 再次在下一个 console.log(x) 中,x 打印为 6。

示例 2:现在让我们使用 let 或 const 关键字测试相同的代码片段。

index.js


输出:

解释:

  1. 首先将创建全局执行上下文。
  2. 然后内存分配阶段开始,在此期间,变量 x 在内存中占有一席之地,javascript 将 undefined 放在那里。
  3. 然后变量 z 在内存的不同位置获得空间,并且与变量 x 相同,然后 undefined 将被分配为值。
  4. 然后线程执行阶段开始,在这个console.log(x)语句执行期间并打印x的值,这是未定义的。
  5. 下一行是console.log(z),javascript会抛出ReferenceError,程序会停在这里。

变量范围:现在让我们看看这些变量的存储范围,注意 var x 未定义并存储在全局对象中,而 let z 也未定义但存储在另一个名为 Script 的地方,这意味着它们都不相同并且 javascript 引擎希望在访问期间有所不同。 let 和 const 变量在用某个值初始化之前是不可访问的,并且从声明 let 或 const 变量的块开始执行到该变量被初始化之间的阶段称为变量的时间死区.在此区域期间,如果有人试图访问这些变量,javascript 将始终通过引用错误。

示例 3:在此示例中,我们将看到处于时间死区的变量。

index.js


输出:

解释:

  1. 在开始时,在全局执行上下文的内存分配阶段, let z 获取脚本对象内的内存空间。
  2. 在线程执行阶段,console.log() 的第一行将执行,z 将处于临时死区,其中也将有 undefined。
  3. 从第 2 行到第 5 行,变量保持在时间死区。
  4. 但是一旦在第 6 行我们用 15 初始化变量 z,它就不再停留在时间死区。
  5. 还有一点,您可能会想到,稍后在程序中将 undefined 分配给 z 将使变量再次处于时间死区,不,它仅适用于初始时间。此外,将某些内容指定为 undefined 也不是一个好习惯,因为 javascript 对该关键字具有特殊含义,因此请不要使用它,否则您可能会遇到意外错误。

避免由于时间死区导致的最常见的引用/类型错误和其他错误的方法:

克服时间死区错误的最有效方法是在作用域顶部初始化变量,这样当我们的代码开始运行时,它首先完成初始化部分,然后使用这些变量,否则你会遇到很多JavaScript 代码中的意外错误。

让我们看一个例子——

main.js


[/div]

输出:

这里首先初始化 x 和 z