1.变量提升:
使用var 关键字声明的变量都存在变量提升,以下代码中,虽然在没有声明变量a之前就调用了a,但是却没有报错,打印出undefined,是因为用var声明的变量会存在变量提升
console.log(a);
var a=10;
根据变量提升原理,以上等价于
var a;
console.log(a);
a=10;
由以上可以明确看出,变量a被声明,只是没有被赋值,所以不会报错。
2.函数声明提升
创建函数的两种方式:
函数表达式方式:
var a =function(){
}
a();
函数表达式方式其实就是变量声名的一种,所以以上代码块也可这样写:
var a;
a=function(){
}
a();
函数声明方式:
function a(){
}
a();
当使用声明方式创建一个函数的时候,存在函数声明提升如:
a();
function a(){
alert("你好!");
}
该代码块将弹出 alert,这是因为在函数被以这种方式创建的时候,函数声明提升的原因,函数在页面打开时就已经被创建好了;
如果使用表达式的方式创建函数:
var a =function () {
alert("holl");
}
a();
正常执行,弹出ho l l,但是不会再存在函数声明提升,执行以下代码后控制台直接报错:a is not a function。
a();
var a =function () {
alert("holl");
}
网上另外一个函数声明提升的例子
console.log(a); //undefined
if (false) {
function a() {
console.log(100);
}
}
a(); //TypeError: a is not a function 理论上应该是100
函数提升发生在所有代码执行之前,所以尽管a函数的定义过程写在了if分支中,但是理论上,它是不会影响函数声明提升的
在新版本的浏览器中会出现此问题,旧版本的浏览器中会在控制台中打印出100
这也提醒了我们尽量不要在控制语句中进行声明,会造成很多无法预知的bug
网友评论