声明前后的JavaScript变量?

声明前后的JavaScript变量?,javascript,function,hoisting,Javascript,Function,Hoisting,有人能回答,javaScript是如何编译或处理这种特殊情况的吗?我知道javaScript在提升时会优先考虑函数声明。但是同一个标识符b如何在同一块下或同一词汇范围内保存两个不同的值呢 有人可能会说,好吧,我将在声明之前使用b作为函数,在分配编号之后使用编号 您可以理解代码执行有两个阶段 创建阶段 执行阶段 创建阶段:-在创建阶段,函数按原样在顶部提升,而变量被提升,但没有分配给它的值(或者可以说它的值未定义) 执行阶段:-在执行上下文期间,当变量到达赋值发生的行时,它将值赋值给变量 所以在创

有人能回答,javaScript是如何编译或处理这种特殊情况的吗?我知道javaScript在
提升时会优先考虑
函数
声明。但是同一个
标识符
b
如何在同一块下或同一词汇范围内保存两个不同的值呢


有人可能会说,好吧,我将在声明之前使用
b
作为
函数
,在分配
编号之后使用
编号

您可以理解代码执行有两个阶段

  • 创建阶段
  • 执行阶段
  • 创建阶段:-在创建阶段,函数按原样在顶部提升,而变量被提升,但没有分配给它的值(或者可以说它的值未定义)

    执行阶段:-在执行上下文期间,当变量到达赋值发生的行时,它将值赋值给变量

    所以在
    创建阶段的代码中
    函数b被提升,编译器将像这样读取它

    function a(){ 
       console.log(typeof b); // function
       function b() {
         var c = 52; 
         console.log(c);
       } 
       var b = 88;  
       console.log(typeof b); // number 
    }
    
    所以当你到达终点时

    function a(){ 
       function b(){
         var c = 52; 
         console.log(c);
       } 
       console.log(typeof b); // function
       b = 88;  
       console.log(typeof b); // number 
    }
    

    它为变量
    b
    分配了一个新值,该变量的类型为
    number

    ,据我所知,这不是两个不同的引用

    内部,,
    function b(){/*code Here*/}
    作为
    var b=function(){/*code Here*/}
    执行 因此,第一个
    typeof(b)
    返回函数

    var b=88时执行,这基本上将88分配给已经存在的b引用。
    因此,第二个
    typeof(b)
    返回数字

    运行时映像以供参考:

    在这种情况下,吊装过程如下:

  • 声明
    var b
    ,不进行初始化
  • 声明
    函数b
    ,它覆盖var声明
  • 将值
    88
    分配给变量
    b
  • 因此,函数实际上被转换为“逻辑等价物”:

    函数a(){
    var b;//已吊装
    b=函数b(){//已提升
    var c=52;
    控制台日志(c);
    } 
    console.log(typeof b);//函数
    b=88;
    console.log(typeof b);//编号
    }
    
    注:

    和的可能重复项
    b = 88