学习js必须理解的提升

222 阅读2分钟

在js代码执行之前,会先进行预编译,在预编译时,变量和函数会在提升机制的作用下进行提升,提升为代码的编写带来了诸多不便,这篇文章是我对提升的学习总结。

什么是提升

要回答这个问题,我们先看一段代码

    var a=10;
    function a(){
        console.log("函数运行")
    }
    a();

这段代码,最后的输出结果应该是输出一个“函数运行”吧。

错!

实际运行起来后会报错,错误提示是“a is not a function”,a不是一个函数。

为什么会出现这样的结果,就是提升机制在从中作祟

所谓提升,就是在预编译过程里,js会自动将用var声明的变量、函数移到其作用域的最上面。而且函数提升的优先级高于变量。

于是上面这个例子报错的原因就很好理解了,预编译时函数和变量提升,且函数先提升至最顶端。

变量的提升

用var声明的变量会发生提升,用let声明的变量并不会。。。(明白let的强大之处了吧)

例子:如下代码

    var a=10;
    console.log(b);
    var b=20;

输出结果为

???为什么会输出underfined???,不是变量会提升吗???

原因是这样滴~

这段代码在预编译后实际为:

    var a;
    var b;
    a=10;
    console.log(b);
    b=20;

所以变量的提升仅仅提升了声明,并不提升赋值。

函数的提升

还是例子:

    f();
    function f(){
        console.log("hello")
    }

函数提升至顶端,所以可以调用

再次重申的重要一点:函数提升的优先级高于变量,函数会比变量先提升。

再来个栗子:

    f();
    var f=function(){
        console.log("hello")
    }

运行结果为

这个例子可以推断出用函数表达式定义的函数不会发生提升

结束

在学习js的过程中,有时候会莫名遇到一些问题,有可能就是提升引起的,本文对提升做了简要说明,希望有所帮助。