变量提升

115 阅读1分钟
  1. 函数声明与变量声明都存在声明提升,但是函数声明提升跟变量声明提升还是有一些区别的。
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
}
  1. 在同一个执行上下文中,如果声明的变量名称与已经声明的形参或者函数名称相同,变量声明并不会影响后两者。
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