js预解析

1、js引擎运行js分为两步:
预解析代码执行 
(1). 预解析js引擎会把js里面所有的var 还有function 提升到当前作用域的最前面
(2).代码执行按照代码书写的顺序从 上往下执行


2、预解析分为变量预解析(变量提升) 和函数预解析(函数提升)
(1) 变量提升就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
(2)函数提升就是把所有的函数声明提升到当前作用域的最前面 不调用函数
 

1.预解析


JavaScript代码由浏览器中的JavaScript解析器来执行的。JavaScript 解析器在运行JavaScript代码的时候
分为两步:预解析代码执行

几个小问题

1、

 // 1问
         console. log(num);

此时会输出 num is not defined (因为num没被定义)

2、坑1

// 2问
       console.log(num); // undefined 坑1
       var num = 10;

此时会输出  undefined    

因为  变量提升,但不提升赋值操作 ,所以相当于

var num;
console.log(num);
num=10;

只定义为赋值,则为 undefined

3、

// 3问
     fn();
     function fn() {
         console.log(11);
     }

因为预解析函数提升到当前作用域最前面,所以相当于


     function fn() {
         console.log(11);
     }
     fn();

4、坑2

// 4问
    fun();
    var fun = function() {
         console.log(22);  //坑2
    }

因为函数为函数表达式定义法,所以相当于

var fun;
fun();
fun=function(){
    console.log(22);
}

将变量提升到当前作用域最前面,因为此时仅声明变量,fun并不是为一个函数,此时调用fun()函数就会报错(fun is not a function)

面试例题(重要):

//案例4:结果是几?
        //案例4
        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;
            console.log(a) ;
            console.log(b) ;
            console.log(c) ;
        }
        f1();
        console. log(c) ;
        console. log(b) ;
        console. log(a) ;

函数f1被提升到最前面 ,因为定义变量时应该以逗号(,)分隔,但此题(var a=b=c=9)未以逗号分隔 ,所以相当于  var a=9; b=9;  c=9;   因为在函数内部,变量未声明直接赋值是  全局变量

所以此处b,c为全局变量 ,则结果为

9,9,9,9,9,a is not defined  (未声明  报错)

案例2:

        var num=10;
        fun();
        function fun(){
            console.log(num);
            var num=20;
        }

由于就近原则,变量提升,代码相当于

        var num=10;
        fun();
        function fun(){
            var num;
            console.log(num);
            num=20;
        }

在函数内  num 声明未赋值,因此结果为 undefined

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值