js预解析(面试哦)

2019-02-12  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读