(函数表达式声明也认为一种特殊的变量声明,函数直接声明才拥有函数提升)
- 函数提升优于变量提升执行
- 变量提升只提升声明,函数提升声明和赋值
- 变量声明不会覆盖变量或函数的赋值
- 函数声明会覆盖同名的变量声明和函数赋值,但不会覆盖变量赋值!
- 立即执行函数(IIFE)中存在局部作用域,变量只会提升到函数内的顶部
function fn(){
console.log(1)
}
fn();//2
var fn=100;
function fn(){
console.log(2)
}
var a = 3;
function a(){};
console.log(a); //3
console.log(a); //function a(){}
var a = 3;
function a(){};
//相当于执行了如下代码:
function a() {};
var a;
console.log(a);
a = 3;
同时存在两种函数赋值时,由于函数优先提升后被表达式赋值复写,因此执行表达式赋值。
// 函数表达式
var f = function() {
console.log(1);
}
// 直接声明
function f (){
console.log(2);
}
f();// 1