提升

84 阅读1分钟

变量和函数在内的所有声明均会在执行前处理完毕;(先声明,后赋值)

比如:

var a = 2;

编译器分为两步:

第一步:var a: 定义声明在编译阶段进行;
第二部:赋值声明留在原地等待执行阶段;(只有声明本身会提前,赋值和运行逻辑留在原地)

注意:

函数声明会被提升,函数表达式不会被提升;
函数声明:funtion为第一个词;   
    function a() {
        var a;
        console.log(a); // undefined
        a = 2
    }
    a()
函数表达式:
    a() // TypeError;
    var a = function() {}

函数优先

函数提升优先于变量;
例如:
    fun()
    var fun;
    function fun() {
        console.log(1)
    }
    fun = function fun1() {
        console.log(2)
    }
最终输出:1;
原因:函数声明提升,且函数提升优先于变量;
浏览器执行解析:
function fun() {
    console.log(1)
}
var fun; // 重复声明被忽略
fun() // 输出内容
fun = function fun1() { // 函数表达式,执行逻辑在原地
    console.log(2)
}