42.js--预编译

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


1.预编译步骤

js完成解释执行分为三个步骤:1.语法分析;2.预编译(全局预编译、函数预编译);3.执行语句。

1.语法分析

        符号、大括号等语法检查;

2.函数预编译

        变量声明提升,function函数声明整体提升;发生在函数执行的前一刻(实际过程如下):

           (1) 创建AO对象--Activation Object(执行期上下文):AO{ };
           (2) 找形参和变量声明,将变量和形参名作为AO属性名,即变量提升过程,值为undefined;
           (3) 将实参的值放到形参中去
           (4) 在函数体里面找函数声明,值赋予函数体


function fn(a) {
	console.log(a);
	var a=123;
	console.log(a);
	function a() {}
	console.log(a);
	var b = function() {}
	console.log(b);
	function d() {}
}
fn(1);

(1) 创建AO对象--Activation Object(执行期上下文):
        AO{ };

(2) 找形参和变量声明,将变量和形参名作为AO属性名,即变量提升过程,值为undefined;
        AO {
            a:undefined,
            b:undefined
        }

(3)将实参的值放到形参中去
        AO {
            a:1,
            b:undefined
        }

(4)在函数体里面找函数声明,值赋予函数体从(a属性在AO对象中已存在,故只增加d属性):
        AO {
            a:1,
            b:undefined,
            d:
        }
到(给属性值赋予函数体):
        AO{
            a:function a() {},
            b:undefined,
            d:function d() {}
        }

2.函数调用时  怎么运行代码的?  

1.分析代码是否正确  符号  词法分析

            var var=20;
			var 01js=100
			var a;
			var a,

2.隐式操作 ==> 预编译:函数调用了以后  在运行代码之前        

        2.1函数每次调用都会生成一个对象:执行期上下文对象

        2.2.给AO对象添加成员:函数内部的局部变量和形参变量 名 作为AO对象的属性名

	        AO:{a:undefined}
			ao.a=undefined
			ao.a=undefined//形参和局部变量一样的时候 不影响

        2.3.把传入的实参赋值给AO对象的属性

AO:{a:100}

        2.4.局部函数声明,赋值   把局部函数的名字让AO对象也有一个一样的成员名,把函数体赋值给这个属性

            //AO:{a:100,fn:function fn () {}}	
		
			function fm(a) {
				console.log(a)
				var a=20
				function  fn () {}
				console.log(a)
			}
			var b=100
			fm(b)
			

3.运行代码: 预编译过的就不在运行

            //AO:{a:100==>20,fn:function fn () {}}

			console.log(a)    //100
			a=20
			console.log(a)    //20

3.全局预编译

全局“即从页内js的script 的开始标签到结束标签,从页外js文件的第一行到最后一行。

全局预编译过程与函数预编译过程大致相似,只是全局上无形参、实参的概念。

1、生成一个GO对象--Global Object{},GO===window
2、变量提升
3、函数提升

//全局预编译举例:
    console.log(a)
    var a=123;
    function a(){}
    console.log(a)

该程序的预编译过程:

/*

        1、GO{}
        2、GO{
                    a:123
              }
        3、执行
           a. 打印:function a(){}
           b. GO{a:123}
           c. 打印:123

*/

全局预编译举例:

        	console.log(a)
			var a = 20
			function fn() {
				console.log(66)
			}

运行结果:

 全局作用域运行代码时  也有预编译==>全局预编译

运行过程:

           1.生成一个对象Global Object  (GO)

                    GO:{}

            2.把所有的全局变量 设置为GO的属性名

                    GO:{a:undefend}

            3.把所有函数名 作为GO的成员名,把函数体赋值给这个成员

                    GO:{a:undefend,fn:function fn(){console.log(66)}}

            4.执行代码

                    GO:{a:undefend==>20,fn:function fn(){console.log(66)}}

                    console.log(a)       //undef

                    a = 20 

不同的环境中运行js代码不一样

GO对象的成员全部浅拷贝给环境对象window

node.js 环境中没有这一步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值