美文网首页
js预解析(面试哦)

js预解析(面试哦)

作者: 让思念入土 | 来源:发表于2019-02-12 21:31 被阅读0次

    js 代码通过 js 解释器(js 引擎) 来执行的

    js 解释器 来执行js 代码分为两步: 首先预解析 再 代码执行

    预解析

    1、首先把函数声明和变量声明,提升到当前作用域最前面。(原因,是因为JS是一个解释执行的脚本语言,从上到下执行。如果函数调用出现在函数定义之前,就会导致失败。)

    带来的问题:

    函数定义的提升没有太大影响
    
    变量定义的提升,是有影响的
    
    先把变量定义提升到最前面,然后按顺序执行代码,会出现变量赋值之前就对变量进行了操作的情况。违背了一个原则变量在第一次使用之前应该完成声明和初始化!!ES6中解决了这个问题。
    

    2、变量提升的是声明并不赋值, 函数 只提升声明 并不调用

    执行代码

    按照从上到下的顺序执行

            //案例1
            var num1;
            console.log(num1);//undefined
    
    
            //案例2
            console.log(num2);//undefined
            var num2=10;
     
    
            //案例3
            console.log(num3);//报错  num3 is not defined
    
            // 相当于执行了以下代码
            var num2;
            console.log(num2);
            num2=20;
            
    
            //案例4
            fn();  //1
            function fn(){
                console.log(1);
            }
    
    
            //案例5
            fun();   // 报错  fun is not a function
            var fun=function(){
                console.log(2);
            }
    
            // 相当于执行了以下代码
            var fun;
            fun();
            fun=function(){
                console.log(2);
            }
    
    
    
             //案例6
            var fun=function(){
                console.log(2);
            }
            fun();   //2
    
            // 相当于执行了以下代码
            var fun;
            fun=function(){
                console.log(2);
            }
            fun(); 
    
    
    
            //案例7
            f1();
            console.log(c);
            console.log(b);
            console.log(a);
    
            function f1(){
                var a=b=c=9;
                console.log(a);
                console.log(b);
                console.log(c);         
            }
    
    
            //相当于执行了以下代码
            function f1(){
                //var a=9; //局部变量  外面不能使用
                //b=9; // 函数内部未声明 直接赋值使用的全局变量
                //c=9; // 函数内部未声明 直接赋值使用的全局变量
                var a=b=c=9;
                console.log(a);
                console.log(b);
                console.log(c);
            }
            f1();
            console.log(c);
            console.log(b);
            console.log(a);
    

    函数名与变量名冲突:

    console.log(a);
    var a = 1;
    console.log(a);
    function a() {
         return false;
    } 
    
    //相当于执行了以下代码
    var a;
    function a() {
        return false;
    }
    console.log(a);//函数在js里属于一级公民  如果变量名和函数冲突,则会有优先执行 函数
    a=1;
    console.log(a); // 就近原则  1
    

    相关文章

      网友评论

          本文标题:js预解析(面试哦)

          本文链接:https://www.haomeiwen.com/subject/nqrleqtx.html