Javascript吊装示例所需的解释

时间:2016-04-13 10:08:55

标签: javascript hoisting

我正在浏览一些Javascript Hoisting概念并遇到了这个例子。

console.log(a)
var a=5;

function a(){
console.log('In Console')
}

console.log(a)

输出

function a() {
 console.log('In Console');
} 

5

我不理解两个 console.logs 的不同行为

任何人都可以解释一下吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

根据spec

  
      
  1. 让declaredFunctionNames为空List。

  2.   
  3. 让declaredVarNames为空列表。

  4.   

另外

  

15.b.i让bindingExists为varEnvRec.HasBinding(vn)。

这意味着JS引擎将首先提升函数声明,并在迭代变量声明时检查变量是否已经具有绑定。

说明如下

// Before the following console statement function has been hoisted already and variable declaration is ignored.
console.log(a)

var a=5; // now the value of a is initialized.

//this statement has been hoisted above already
function a(){
console.log('In Console')
}

//value of a is 5 now
console.log(a)

答案 1 :(得分:0)

函数声明以它的身体(按规格)悬挂。因此,function a在第一次log之前被提升。然后,重新分配变量a,第二个log打印5。

因此,在提升后你的功能变成了这样的东西:

var a;

a = function(){
    console.log('In Console')
}

console.log(a)
a=5;
console.log(a)