函数声明总会被提升到函数体的最顶部。但是对于不同的函数声明方法,提升的东西不一样。对于关键字function申明的函数,会将整个函数体提升到作用域的顶部,而通过表达式声明的函数,只会先将变量提升,而赋值不会提升。
- 以下两个代码段相同
function foo(){
function bar(){
return 3;
}
return bar();
function bar(){
return 8;
}
}
console.log(foo());//8
function foo(){
function bar(){
return 3;
}
//redefined bar function
function bar(){
return 8;
}
return bar();
}
console.log(foo());//8
- 以下两个代码段相同
function foo(){
var bar=function(){
return 3;
}
return bar();
var bar=function(){
return 8;
}
}
console.log(foo());//3
function foo(){
var bar=undefined;
var bar=undefined;
bar=function(){
return 3;
}
return bar();
//没有执行第二个
}
- 以下两个代码段相同
console.log(foo()); //3
function foo(){
var bar=function(){
return 3;
}
return bar();
var bar=function(){
return 8;
}
}
function foo(){
var bar=function(){
return 3;
}
return bar();
var bar=function(){
return 8;
}
}
console.log(foo()); //3
- 以下两个代码段相同
function foo(){
return bar();
var bar=function(){
return 3;
}
var bar=function(){
return 8;
}
}
console.log(foo()); //error bar is not a function
function foo(){
var bar=undefined;
var bar=undefined;
return bar();
bar=function(){
return 3;
}
bar=function(){
return 8;
}
}
console.log(foo()); //error bar is not a function