第四章 提升
例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) 收藏 举报