javascript学习笔记-函数声明提升和变量声明提升

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

你可能感兴趣的:(javascript学习笔记-函数声明提升和变量声明提升)