Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-上下文执行阶段_Javascript_Hoisting - Fatal编程技术网

Javascript-上下文执行阶段

Javascript-上下文执行阶段,javascript,hoisting,Javascript,Hoisting,我知道JavaScript中的“执行”分为两个阶段: 1) 创建阶段,在内存中添加函数和变量,这就是创建和外部环境 2) 执行代码时的第二个阶段 问题是:父函数中的变量和函数是在脚本启动时添加到内存中的,还是仅在调用父函数时添加 在这方面,函数参数的行为和函数内部声明的变量之间有什么区别吗?(我这样问是因为在其他语言中,它们的行为不同-参数在函数执行之前在内存中,但在函数的范围内)如果脚本启动时所有函数中的变量和函数都已放入内存,则在启动时内存可能已满。当函数执行时,此时变量和内部函数被添加到内

我知道JavaScript中的“执行”分为两个阶段:

1) 创建阶段,在内存中添加函数和变量,这就是创建和外部环境

2) 执行代码时的第二个阶段

问题是:父函数中的变量和函数是在脚本启动时添加到内存中的,还是仅在调用父函数时添加


在这方面,函数参数的行为和函数内部声明的变量之间有什么区别吗?(我这样问是因为在其他语言中,它们的行为不同-参数在函数执行之前在内存中,但在函数的范围内)

如果脚本启动时所有函数中的变量和函数都已放入内存,则在启动时内存可能已满。当函数执行时,此时变量和内部函数被添加到内存中。当函数结束执行时,如果相关变量未在内存中使用,则会将其从内存中删除

函数的参数行为之间存在任何差异 和函数中声明的变量

在行为上没有明显的区别,参数也是在函数范围内声明的变量,只有它们可以从外部获得它们的值

一个不同之处是,将引用类型传递给函数并在函数中更改其属性。因此,它将在函数本身之外进行更改。这意味着可以通过某种方式将参数绑定到外部世界。但我认为这与参数和范围变量的行为无关。它们都被限定在函数的范围内

在函数执行之前,参数在内存中,但在 职能范围


Javascript函数可以接受不同数量的参数。因此它无法将参数添加到内存中。你可以拥有一个没有参数的函数,但是调用它并向它传递10个参数。

你本质上是在问一些依赖于JS引擎内部工作的问题。JavaScript程序可以经历许多阶段,包括“解析”阶段,但在实践中,出于不同的目的,在多个阶段、不同的级别上会发生不同类型的解析。(我不会称之为“创建”阶段;这个术语是不标准的,令人困惑的。)不同解析阶段的结果可以是内部语法树,或者中间字节码表示,甚至是准备执行的机器码。相同的代码可能在不同的时间点以不同的方式进行解析,或者在某些情况下进行解析,然后将结果丢弃,稍后再重新解析,等等

关键是,除非你在学习编译理论,否则这并不重要。是的,解析可以被认为是“提升”发生的地方。然而,我希望你们不要花太多时间担心吊装,除非你们打算参加某种JS琐事比赛。只需在每个函数的顶部声明所有变量(包括您分配函数的变量),就像您一直以来应该做的那样,然后停止担心它。当其他人因为知道ES6
class
es是否被提升而自责时,你实际上可以编写有用的代码

何时、如何以及在何处分配内存的问题也是引擎内部的一个细节。有些项目可能在“堆”(其中可能有多个)上分配,然后在以后进行垃圾收集。这种分配几乎总是在运行时发生,但这也不是一个硬性规定;例如,解析过程中遇到的regexp可能会以编译后的形式缓存在堆上。其他变量,如原语,可能会在“堆栈”上分配,并在从函数返回时释放堆栈帧时半自动取消分配。嵌入式函数(“闭包”)中需要维护的变量以特定的方式分配和存储

我怀疑知道这些是否会让你在任何意义上成为一名更好的JavaScript程序员。了解一个引擎是如何工作的并不一定能帮助您了解另一个引擎是如何工作的,甚至不能帮助您了解同一个引擎在下一个版本中将如何工作


除了好奇之外,你想知道这一点还有什么特别的原因吗?或者你认为这会带来不同的具体情况吗?

这并不完全正确。在所有语言中,局部变量仅在调用函数时分配给内存。但是,所有函数、表达式、变量等在程序启动时都转换为机器指令。基本上-整个程序在启动时编译一次,根据需要分配内存。哪些行出错?当编译器仅在调用函数时工作时,函数的编译也会延迟。因此,在代码执行过程中创建的机器代码,不是在startI,我不想知道所有的细节,而是想了解在抽象级别发生的事情。理解这些概念、变量的行为、函数、作用域、闭包、this、变量环境、阴影等将帮助我创建更好的应用程序,并理解bug和“奇怪”行为。我不想只使用别人的代码,编写简单的脚本,而是创建自己的脚本。我不想这样做,因为有人这么说或复制粘贴,但我明白为什么。你需要区分定义的语言(其行为),当然你需要知道,和实现的语言(其内部,包括内存分配等内容),即使你可以,也不需要学习。