吊装是可怕的……不!
JavaScript 充满了神秘的概念,其中一个正在提升,相信我,如果你不明白它是如何发生的,它会让你刮目相看。在本文中,我们将深入探讨什么是提升,它是如何发生的,以及它产生的影响是你需要注意的。因此,请系好安全带以揭开吊装的神秘面纱。
Hoist 的意思是“通过绳索和滑轮提升(某物)”,在 javascript 中也是如此,让我们举个例子,在下面的代码中,我通过在声明之前将其记录到控制台来访问“greet”变量,并且它记录为 undefined,你不觉得奇怪吗,是的,这很奇怪,因为如果它是像 Java 这样的静态语言,它会抛出一个错误“greet is not defined”。
JavaScript 提升是指解释器似乎将 宣言 在执行代码之前,将函数、变量或类放在其作用域的顶部。
这是提升的定义 MDN ,让我们用上面的例子来打破它,在它被声明之前我能够访问它的方式,似乎编译器被提升了,即 拉出变量的声明,但不是初始化, 到全局范围的顶部,这就是为什么我能够访问它,但它是未定义的。 “他们的范围之内” 意味着如果一个变量是在全局范围内定义的,它将被移动到全局范围的顶部,同样,如果变量在函数范围内,它将被移动到顶部 它的 功能范围,现在再次阅读它......
JavaScript 提升是指解释器似乎将 宣言 在执行代码之前,将函数、变量或类放在其作用域的顶部。
吊装过程是如何进行的?
要了解提升变量的真正含义,我们需要退后一步讨论javascript代码是如何执行的。在浏览器中,js 代码由浏览器的 JavaScript 引擎执行,例如 Safari 中的 JavaScriptCore、Chrome 中的 V8、Internet Explorer(RIP)中的 Chakra 等等。
引擎通过创建 执行上下文 ,这是处理代码转换和执行的特殊环境。执行上下文的创建涉及两个阶段
- 创建阶段
- 执行阶段
创建阶段 :在创建阶段,执行上下文将各种信息存储在内存中,它将在执行阶段使用。在这个阶段,所有变量都被分配了内存并设置为 undefine(所有这一切甚至在代码开始执行之前就发生了),正如您在下面的全局范围中看到的那样,“abc”变量已经被分配了内存,并被分配undefined 虽然到目前为止还没有代码运行,这意味着变量“abc”甚至在原始代码中声明之前就可以使用。
还与 函数语句 ,指向函数的指针被添加到内存中,这意味着我们也可以在函数声明之前使用函数,这就是我可以在函数语句之前调用“square(3)”的原因。
看到函数“aasquare”在执行之前已经在我们的全局对象中定义了
记笔记 我们讨论的是函数语句,而不是函数表达式,因为函数表达式不是作为函数语句而是作为变量提升的,应该是这样的,因为在函数表达式中我们将一个函数分配给一个变量,而变量是用 undefined 提升的在创作阶段。这就是为什么“aasquare”未定义的原因,因为 js 引擎将其视为变量,而不是函数。
执行阶段: 创建阶段结束后,执行阶段开始,在此阶段代码被执行(显然),变量的值更新为它们的实际值,因此“abc”的值从未定义更新为“Hello”作为第 2 行的代码被执行。此外,函数调用被执行。
既然我们知道了,提升给了我们在代码前面使用变量和函数的超能力,让我们更多地谈谈变量提升。 javascript中声明变量的三种方式,分别是 var 或 let 或 const 关键字,我在上面的示例中使用 var 是有原因的,原因是尽管带有 let 或 const 关键字的变量也被提升为 var (请参见下面的代码),但直到相关的代码行才能访问它们由于时间死区(TDZ),声明得以执行。
抛出 RefrenceError,试图在声明之前访问 let 或 const,因为它们位于 TDZ 中。 TDZ 从变量作用域(在我们的例子中是全局作用域)执行的开始开始,并在它被声明时结束。有关变量声明的更多信息,请参见 javascript中的var vs let vs const .
这结束了我们关于提升的讨论。
我希望你喜欢它。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/12492/49410412
标签:变量,代码,提升,吊装,可怕,执行,声明,函数 From: https://www.cnblogs.com/amboke/p/16654889.html