- 函数声明与变量声明都存在声明提升,但是函数声明提升跟变量声明提升还是有一些区别的。
console.info(y) //undefined
var y= 1;
console.info(name()) //2
function name(){
return 2
}
2.函数声明会覆盖变量声明,但是不会覆盖变量赋值。
function name(){}
var name;
console.info(typeof name)//结果为function
但是,如果是变量赋值
function name(){}
var name=1;
console.info(typeof name) //结果为number
3.这种情况属于变量赋值,test并不会进行变量声明与提升。
console.info(test) // test is not defined
var xx = function test (){
return 2
}
- 在同一个执行上下文中,如果声明的变量名称与已经声明的形参或者函数名称相同,变量声明并不会影响后两者。
console.info(y); //fuction
var y = 1;
console.info(y);//1
y = 2;
console.info(y)//2
function y() {
return 2
}
console.info(y)//2
在刚进入执行上下文时,变量对象被初始化为
{
y=<reference to FunctionDeclaration "x">
/* 假如没有function y 的声明
* 此时y的值为undefined
*因此在该上下文中变量的声明并没有影响函数的声明
*在代码执行阶段,VO的y值做了如下改变:
1. VO[y] = 1;
2. VO[y] = 2;
*
*/
}
变量的声明是在进入上下文时放入到变量对象中的,而不是代码执行阶段,请看以下代码:
if (true) {
var a = 1;
} else {
var b = 2;
}
console.info(b) // undefined