gpt4 book ai didi

javascript - 提升是针对完整代码立即进行还是按嵌套函数级别进行

转载 作者:行者123 更新时间:2023-12-03 02:06:16 26 4
gpt4 key购买 nike

大家好。我不明白有关提升的一些事情,可能是我的错,但我没有找到任何答案,无论是在这里还是在谷歌上,这就是我问的原因,感谢您的阅读。

所以我不明白,当 javascript 引擎获取下面的代码并开始扫描时, 扫描所有函数和嵌套函数的整个代码是否会被抛出,直到最后一个作用域? 所有函数的创建阶段都将在第一次扫描时进行(或者换句话说,完整的代码将仅扫描一次并为每个函数准备好所有内容)?

/* Global execution context*/

function myFirst(){ /*Scanner meets this code and hoists it*/
var A = "12"

return function myFirstB(){ /*As the scanner arrived here and
scanns threw this function during the parents hoisting period ( or just before the global contexts execution phase) will it be hoisted as well, that it gets [[Scopes]] property? So that when I call it in the last line as a closure, it can remember on, that variable "A" is in its outer-environment?*/
console.log(A)
} //myFirstB()

} // myFirst()

function mySecond(){
alert("one")
}

var myClosure = myFirst();
myClosure(); /*before beeing called does this function have already [[Scopes]] property/scope-chain?*/

或者提升是逐级进行的?所以我的意思是,首先那些在全局上下文中定义的函数将被提升? 然后,当这些函数之一被调用并且其执行上下文执行阶段开始时,其嵌套函数是否会被提升?

我正在调查这个,因为我真的不明白,嵌套函数如何记住它在哪个词法环境/函数中定义的,如果它至少还没有被提升,它有一个 [[Scopes]] 属性,保留其作用域链

这个问题是我到目前为止看到的所有文章,甚至 ecmascript 6 文档也只说,如果扫描器满足函数定义,就会发生提升,然后将使用作用域链和变量对象创建作用域属性参数对象和“this”关键字,但我没有找到任何 Material 来讨论嵌套函数(保存在变量对象中,并在内存中引用它们的函数体)是否至少是也被提升(同时,它们的父函数被提升),并且如果从外部环境外部调用它们,它们就会得到一个作用域链来记住它们的外部环境

感谢很多人阅读我的大量文字,如果你能回答,或者如果你有一篇文章谈论这方面以及提升,我真的很感激

最佳答案

我觉得你之所以迷茫,是因为你纠结了太多的事情。您需要区分三件事:

  • 解析器做什么
  • 创建范围后会发生什么
  • 代码运行时会发生什么

解析器确实扫描了整个代码。如果任何地方出现语法错误,则任何代码都不会运行。它确实将整个代码解析为适合稍后执行的(嵌套)结构。这可能是 abstract syntax tree或可执行字节代码,或介于两者之间的任何内容 - 这是实现细节。

在运行一段代码之前,例如在全局作用域、 block 作用域或函数作用域中,必须首先创建并初始化该执行的上下文。它确实获得了父作用域引用(例如, block 周围的作用域或定义闭包的作用域)、this 值以及创建该作用域变量的新变量环境。这里是作用域中声明的所有变量名(例如函数参数、varfunction 以及 letconst) > 和 class 声明等)用于实例化新变量。

当代码块执行statement forstatement和expressionforexpression时,变量已经存在。这是创建值并将其分配给变量的时间。当定义一个函数时,它确实通过引用当前作用域而成为一个闭包。

术语“提升”is giving the wrong impression 。没有源代码被移动。实现如何实现指定的行为不受限制。解析器可能会创建字节代码,在每个作用域的顶部创建变量。可能是在作用域的初始化阶段,它每次都会扫描 AST 来查找声明。它很可能是即时编译器形式的混合,它仅在第一次调用函数时创建字节代码。

关于您关于嵌套函数的问题,请记住,每次调用外部函数时都会重新创建内部函数。它仅“提升”到其作用域的顶部,而不是外部函数之外,并且将在每次运行代码时重新定义。

关于javascript - 提升是针对完整代码立即进行还是按嵌套函数级别进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49792493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com