众所周知,在ES5的规则下,使用var声明变量,变量会提升,函数亦是如此,但是如果碰到函数名和变量名是同一个的情况下,代码会如何执行呢?先看下面的例子
foo(); //1
var foo;
//这是一个函数声明
function foo(){
console.log(1);
};
// 这是一个函数表达式,不会提升,如果是一个函数声明则会提升
foo = function(){
console.log(2)
}
上面的代码会输出 1 而不是 2,原因就是函数的提升 由于变量的提升,这段代码会被引擎理解为如下代码
function foo(){
console.log(1);
}
foo();//1
foo = function(){
console.log(2)
}
/*
ps: var foo 虽然在 function foo(){...}的声明之前,但它是重复声明,会被忽略
*/
二、函数的声明会覆盖前面已有的函数声明
// 此段代码的输出结果是 3
foo();//3
function foo(){
console.log(1)
};
var foo = function(){
console.log(2)
};
function foo(){
console.log(3)
};
/* 上面的代码会被引擎理解为*/
function foo(){
console.log(3);
};
foo();//3
// 注:此段代码不会提升,因为这是函数表达式,而不是函数声明
foo = function(){
console.log(2)
}
foo();//2
再来个例子巩固下上面的
console.log(foo());//3
function foo(){
return 1;
}
console.log(foo());//3
foo = function(){
return 2;
};
function foo(){
return 3;
};
console.log(foo());//2
/*此段代码会被引擎解析成 function foo(){return 1;} 被覆盖了*/
function foo(){
return 3;
}
console.log(foo());//3
console.log(foo()); //3
foo = function(){
return 2;
};
console.log(foo());//2