JavaScript 变量声明前后?

JavaScript variable before and after declaration?

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

任何人都可以回答,javaScript 如何编译或处理这种特殊情况?我知道 javaScript 在谈到 hoisting 时优先考虑 function 声明。但是,同一个 identifier b 如何在同一个块或同一个词法范围内保存两个不同的值?

有人可能会说,好吧,我将在声明之前将 b 用作 function,并在分配 number 后用作 number

你可以这样理解代码执行有两个阶段

  1. Creation phase
  2. Execution phase

创建阶段:-创建阶段函数原样吊顶,变量吊顶但没有分配给它的值(或者你可以说它的值是未定义的)

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

所以在你的代码中 creation phase 函数 b 被提升,编译器会像这样读取它

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

所以当你到达那条线时

b = 88

它为number

类型的变量b分配一个新值

据我所知,这不是两个不同的参考文献。

在内部, function b(){/*Code Here*/} 执行为 var b = function(){/*Code Here*/} 因此,第一个 typeof(b) returns 函数 .

并且当var b = 88;执行时,这基本上将88分配给b的已经存在的引用。 因此,第二个 typeof(b) returns number.

运行时图片供参考:

在这种情况下,提升发生如下:

  1. 声明var b,没有初始化
  2. 声明 function b,它覆盖了 var 声明
  3. 将值88赋值给变量b

所以函数实际上被转换为 "logical equivalent" of:

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

注:Only declarations are hoisted, not initializations