Javascript 函数声明优先/覆盖变量声明?吊起为什么?

Javascript 函数声明优先/覆盖变量声明?吊起为什么?,javascript,memory,functional-programming,variable-declaration,function-declaration,Javascript,Memory,Functional Programming,Variable Declaration,Function Declaration,片段1: var a;//名为“a”的未定义变量 函数a(foo){//a名为'a'的函数 var foo=“你好,世界”; console.log(foo); } console.log(a);//输出为:[函数:a],但为什么不定义? 我的问题是,在这两种情况下,为什么函数声明“覆盖”/“隐藏”或“优先于”变量声明?有人能解释一下这种行为吗 两个代码段中只有一个地方给变量a赋值,那就是函数声明。语句var a表示“我宣布名为a的变量存在”。由于函数声明负责声明它的存在并给它一个值,var

片段1:

var a;//名为“a”的未定义变量
函数a(foo){//a名为'a'的函数
var foo=“你好,世界”;
console.log(foo);
}
console.log(a);//输出为:[函数:a],但为什么不定义?
我的问题是,在这两种情况下,为什么函数声明“覆盖”/“隐藏”或“优先于”变量声明?有人能解释一下这种行为吗

两个代码段中只有一个地方给变量
a
赋值,那就是函数声明。语句
var a
表示“我宣布名为
a
的变量存在”。由于函数声明负责声明它的存在并给它一个值,
var a语句实际上没有任何效果

事实上,如果我们参考JavaScript规范,我们可以看到这个
var的最终结果是a
实际上是什么都不做,因为
a
变量在
var a时已经声明声明已处理

我知道,由于“提升”现象,这些可能在最终结果方面是相同的(从解释器的角度来看),但为什么在创建阶段Javascript引擎解释/解析函数声明或变量声明时,它们优先于其他声明

这里没有什么是“优先”的。只有一个变量名为
a
<代码>变量a
没有给
a
一个值,因此它对
a
的值没有影响

另外,请参考第一个代码段(但这两种情况都适用),第1行和第6行中声明的“a”的内存位置/地址是否完全相同

只有一个
a
变量,它只接受一个值,所以这个问题基本上是没有意义的,但粗略地说,
a
变量本身只存在于一个地方,它只引用一个值(内存位置),这就是该函数的定义

由于函数声明“挂起”在变量声明之上,这是否意味着在执行上下文的创建阶段结束时,第1行“a的内存地址”指向函数对象“a”

我对创建阶段的了解并不多,但是在代码执行过程中,
a
只引用了一个值,正如我前面所说的

在这两个代码段中,'var a'都未定义,那么为什么在我们到达执行阶段(其执行点从第6行开始)时,'a'的值未定义呢

请参阅我的第一个和第二个答案

函数声明被覆盖或优先于变量声明的原因是什么?及

正如我所说的,它没有“优先权”,但是JavaScript之所以有函数提升是为了允许人们在函数实际定义之前从代码中的一行调用函数,类似于C#和Java等其他主要语言

如果可能的话,有人能回答一下每一步发生在记忆中的事情吗

JavaScript规范没有定义内存中发生了什么。它定义了代码的外部行为。因此,这将是一个实现细节,并且是特定于引擎的

下面是对代码执行时(在这两种情况下)发生的情况的一次又一次的粗略介绍:

  • 创建一个名为
    a
    的变量,并将该函数的值赋给它
  • 检查是否存在名为
    a
    的变量。已经有一个了,所以什么都不要做
  • 执行
    console.log
    并将
    a
    的值传递给它(这是该函数)
  • 我的问题是,在这两种情况下,为什么函数声明“覆盖”/“隐藏”或“优先于”变量声明?有人能解释一下这种行为吗

    两个代码段中只有一个地方给变量
    a
    赋值,那就是函数声明。语句
    var a
    表示“我宣布名为
    a
    的变量存在”。由于函数声明负责声明它的存在并给它一个值,
    var a语句实际上没有任何效果

    事实上,如果我们参考JavaScript规范,我们可以看到这个
    var的最终结果是a
    实际上是什么都不做,因为
    a
    变量在
    var a时已经声明声明已处理

    我知道,由于“提升”现象,这些可能在最终结果方面是相同的(从解释器的角度来看),但为什么在创建阶段Javascript引擎解释/解析函数声明或变量声明时,它们优先于其他声明

    这里没有什么是“优先”的。只有一个变量名为
    a
    <代码>变量a
    没有给
    a
    一个值,因此它对
    a
    的值没有影响

    另外,请参考第一个代码段(但这两种情况都适用),第1行和第6行中声明的“a”的内存位置/地址是否完全相同

    只有一个
    a
    变量,它只接受一个值,所以这个问题基本上是没有意义的,但粗略地说,
    a
    变量本身只存在于一个地方,它只引用一个值(内存位置),这就是该函数的定义

    由于函数声明“挂起”在变量声明之上,这是否意味着第1行“a的备忘录”