声明前后的JavaScript变量?

时间:2019-05-28 18:44:13

标签: javascript function hoisting

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

任何人都可以回答,javaScript如何编译或处理这种特殊情况?我知道在涉及function时,javaScript优先考虑hoisting声明。但是,相同的identifier b在相同的块下或在相同的词法作用域下如何拥有两个不同的值?

有人可以说,好吧,我要在声明之前将b用作function,并在为其分配number之后将其用作number

3 个答案:

答案 0 :(得分:3)

您可以理解,代码执行分为两个阶段

  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

它将新值分配给类型为b的变量number

答案 1 :(得分:0)

据我所知,这些不是2种不同的引用。

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

执行var b = 88;时,这基本上将88分配给 b 的现有引用。 因此,第二个typeof(b)返回 number

运行时映像供参考: enter image description here

答案 2 :(得分:0)

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

  1. 声明var b,无需初始化
  2. 声明function b,它将覆盖var声明
  3. 将值88分配给变量b

因此该函数实际上被转换为以下内容的“逻辑等效项”:

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