什么是提升

所有的声明(变量或者函数声明)会被移动到各自作用域的最顶端,这个过程被称作"提升",提升的过程是发生在代码被执行之前的编译阶段, 无论作用域的声明出现在什么地方,都将在代码被执行之前首先处理。

var a = 2 问题

1
2
3
    a = 2
    var a
    console.log(a)  // 2

可以看到,编译时变量a被提升,此处打印出2

另一个例子

1
2
    console.log(a) // undefined
    var a = 2

以上代码等价于:

1
2
3
    var a
    console.log(a)
    a = 2

打印出a是undefined是显而易见的

函数优先提升

函数声明和变量声明同时提升时,函数会被优先提升,而且出现在后面的函数声明可以覆盖前面的函数声明。

考虑以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    foo() // 2
    var foo

    function foo() {
        console.log(1)
    }

    foo = function() {
        console.log(2)
    }

函数声明foo被优先提升,因此函数调用foo()打印出2