当前位置: 首页 > Web前端 > JavaScript

JavaScript预编译

时间:2023-03-27 13:23:51 JavaScript

1.题目描述下面代码输出序列vara=1;控制台日志(一);函数fn(a,c){console.log(a);变量a=123;控制台日志(一);控制台日志(c);函数a(){};如果(假){vard=999;}console.log(d);控制台日志(b);varb=function(){};控制台日志(b);函数c(){};console.log(c)}varc=function(){console.log("IatCfunction");}console.log(c);fn(1,2);2.生成分析页面时,会创建一个GO全局对象(GlobalObject)。加载第一个脚本文件。脚本加载后,分析语法是否合法。开始预编译,找到变量声明,将值赋给undefined作为GO属性;找到函数声明,作为GO属性,赋值给函数体;//抽象描述GO/window={a:undefined,c:undefined,fun:function(a,c){...}}解释并执行代码(直到执行调用函数fn(1,2)语句),每个属性赋值//抽象描述GO/window={a:1,c:function(){console.log("IatCfunction");}fn:function(a){...}}所以在fn执行之前,1functionc(){}也在fn执行之前预编译,先创建一个AO活动对象(ActiveObject)//寻找形参和变量声明,并赋值undefinedAO={a:undefined,c:undefined,d:undefined,b:undefined}//将实参赋值给形参AO={a:1,c:2,d:undefined,b:undefined}//连接往下找到函数声明,会覆盖变量声明AO={a:functiona(){},c:functionc(){},d:undefined,b:undefined}然后开始解释执行:第一个console.log(a),毫无疑问会打印出我们上面分析的值functiona(){}第二个console.log(a),因为之前给变量a赋值123,所以会打印出123和第三个console.log(c),打印出functionc(){}的第四个console.log(d),因为条件语句的条件为假,所以不会赋值made,打印出undefined的第五个console.log(b),打印出undefined的第六个console.log(b)。上一句给变量b赋了一个函数,所以打印出来的是function(){}。第七个console.log(c)是由functionc(){}打印出来的。如上所述,我们可以知道//全局环境先打印出1functionc(){}//执行完fn函数后,打印出functiona(){}123functionc(){}undefinedundefinedfunction(){}functionc(){}3.总结与分析在预编译的时候,我们只要按照下面的步骤进行分析,就可以找到正确的答案。创建AO对象,首先要找到形参和变量声明,然后找到函数声明,统一形参和实参。查找函数声明,覆盖变量声明