第四章 提升

例1:

a = 2;

var a;

console.log(a);     //2

例2:

console.log(a);    //undefined

var a = 2;

例3:

console.log(a);    //ReferenceError

a = 2;

 

例2中,var a = 2,Javascript会将其看成两个声明:var a 和 a = 2。第一个定义声明是在编译阶段进行的。第二个赋值声明会被留在原地等待执行阶段。

我们的第一个代码片段会以如下形式进行处理:

var a;

a = 2;

console.log(a);

类似的,我们的第二个代码片段会这样处理:

var a;

console.log(a);

a = 2;

注意,我们的第三个代码片段由于没有var声明,所以在编译阶段不会被提升,就是说少了第一个阶段的var a 的定义声明,执行到console.log(a)时,没有a的定义声明,所以报ReferenceError异常。当执行到a =2的时候,由于LHS的原理,会自动在全局作用域中创建a的声明。

 

函数优先

函数声明和变量声明都会被提升。而函数声明会被提升到普通变量之前。后边出现的函数声明还是可以覆盖前面的。

例:

foo();    //3

var foo = function(){

  console.log(2);

};

foo();    //2

function foo(){

  console.log(1);

}

foo();    //2

function foo(){

  console.log(3);

}

foo();    //2

因为函数声明优先于变量声明,所以第一个foo变量声明会被后面第二个foo函数声明忽略,而后边有两个foo的函数定义,同名函数定义的原则是后边的函数定义会覆盖前边的函数定义,所以实际上foo输出的是最后的那个foo,输出3。而var foo之后的那些foo()函数为什么都输出2呢?是因为此时已经执行了var foo这个变量定义,所以var foo覆盖了前面的foo的函数声明,所以后边输出的都是2。

posted on 2019-02-09 11:57  atomgame的记事本  阅读(61)  评论(0)    收藏  举报

导航