我正在浏览一些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 的不同行为
任何人都可以解释一下吗?
谢谢!
答案 0 :(得分:1)
根据spec
让declaredFunctionNames为空List。
- 醇>
让declaredVarNames为空列表。
另外
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)