预编译的过程理解

本文详细阐述了JavaScript预编译的过程,包括创建AO对象、形参和变量声明、实参与形参的统一以及函数声明的处理。通过实例说明了预编译在函数执行前的步骤,探讨了函数提升和变量声明预解析的规则,特别是当存在同名标识符时,函数声明会覆盖变量声明,但不会覆盖赋值的情况。
摘要由CSDN通过智能技术生成

关于预编译的过程与理解

预编译大致分为四部分:
       1.创建AO对象
       2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
       3.将实参值和形参统一
       4.在函数体里面找到函数声明,值赋予函数体

实例

<script>
        function fn(a){
            
            console.log(a);             //function a(){}
            
            var a = 123;
            
            console.log(a);             //123

            function a(){}

            console.log(a);             //123

            var b = function(){}

            console.log(b)              //function (){}
            function d(){}
        }
        fn(1)
</script>

预编译是发生在函数执行前。
       1.创建AO对象 (Activation Object)(执行期上下文)
       2.

	AO={
            a:undefined,
            b:undefined,
        }

       3.找到实参值赋予到形参里去。

		AO={
            a:1,
            b:undefined,
        	}

       4.在函数体里面找到函数声明,值赋予函数体

		AO={
            a:function a(){},
            b:undefined,
            d:function d(){}
        	}

------------预编译过程结束;函数开始执行

<script>
        function fn(a){
            
            console.log(a);             //function a(){}
            //第一个console就是读取AO里面的属性值;
            var a = 123;
            //var变量提升但是赋值没有提升。AO里面的属性 a = 123.
            console.log(a);             //123

            function a(){}

            console.log(a);             //123

            var b = function(){}
			//var变量提升但是赋值没有提升。AO里面的属性 b = function(){}
            console.log(b)              //function (){}
            function d(){}
        }
        fn(1)
</script>

在有些人口中,遵循两句话就能理解预解析。
       1.函数整体提升。2.变量声明预解析不会提升赋值。
但在下面这个例子是行不通的

<script>
		console.log(a);				//得到的是function a(a){}的函数
        function a(a){
            var a = 234;
            var a = function(){}
        }
        a();
        var a = 123;
    </script>

如果要想记住上面的的话,可能还需要记住一句话:
       同一个标识符的情况下,变量声明与函数声明都会提升;函数声明会覆盖变量声明,但不会覆盖变量赋值,即:如果声明变量的同时初始化或赋值那么变量优先级高于函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值