一定要知道的变量和函数提升

118 阅读1分钟

一.js解析

js解释引擎:词法分析->语法分析->语法树
词法分析是将字符流(char stream)转换为记号流(token stream)
    比如var for if这些关键字会标记出来
js解析:预编译期(预处理、预解析、预编译)与执行期
    在预编译期,当javaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理

二.js变量提升

在预编译期,变量声明提前(值留在本地),函数声明提前(整个代码体提前)
如:
    console.log(a); //undefined
    var a = 10;
    console.log(a);  //10  
    function fu(){} 
    function test(){
        a=100;
        console.log(a);  //100
        var a;
        console.log(fu)  //function fu(){}
    }
编译后的代码做了变量提升:
    var a;
    console.log(a);
    a=10;
    console.log(a);
    //function fu(){} 
    function test(){
        //函数内部只做函数内部的提前
        var a;
        a=100;
        console.log(a);  //100
        console.log(fu)  //function fu(){},会全局去找
        console.log(fu)  //如果是var fu = function的话则打印的是undefined
    }
    test();
    //var fu = function(){}