本篇内容介绍了“JavaScript预编译过程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!词法语法分析:词法语法分析就是检查JavaScript代码是否有一些低级的语法错误预编译:本文主讲执行代码:执行代码就是js引擎解析代码,解析一行执行一行这章主要讲预编译过程预编译也分为2个时间点:第一个是在JavaScript代码执行之前第二个是在函数执行之前。但是JavaScript代码之前,之前的预编译只发生一次,函数执行之前的预编译是多次的。JavaScript代码执行之前,首先会创建一个全局对象,可以理解为window
对象,也可以理解为GO(Global Object
)对象,我们是看不到的(无法打印)然后将所有声明的全局变量、未使用var
和let
声明的变量放到GO对象中,并且赋值为undefined
(联想到“变量提升”)分析**函数声明:**然后再将所有的函数声明也放到GO对象中,并且赋值为函数自身的函数体(函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖)结合上面说的步骤:首先,中的代码执行之前会创建一个GO对象(window对象)将所有声明的全局变量、未使用
var
和let
声明的变量放到GO对象中,并且赋值为undefined
分析函数声明,函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖此时完成了js代码执行之前的预编译过程,开始执行js代码,首先是给a进行赋值为1,在GO对象里边也会进行对应的改变:然后打印a,此时会在GO对象上去找变量a,然后此时的a的值为1,所以console.log(a)
是等于1的。接着打印b,也会去GO对象上找,找到了b的值为undefined
,所以console.log(b)是等于undefined
。接着执行到赋值语句:b = 10;
此时GO对象里b的值变成了10接着下一行代码是一个**fun
函数,此时不会去执行该函数**,因为在前面的预编译过程中实际上是被放到了代码的最前端,就是传说中的声明提前,所以忽略掉了。接着给a2进行赋值操作:a2 = 20
,GO对象也发生变化:接着是执行fun
函数,如上面说到的另外一个时间点发生的预编译,就是执行函数之前,现在就来说一下函数执行前的预编译是怎么样的。函数调用,也是会生成自己的作用域(**AO:**Activetion Object,执行期上下文)AO活动对象。函数调用时候,执行前的一瞬间产生的,如果有多个函数的调用,会产生多个AO如果遇到AO对象上属性同名,则无情覆盖生成AO对象:函数执行前的一瞬间,生成AO活动对象分析生成AO属性:查找形参和变量声明放到AO对象,赋值为undefined
分析函数声明:查找函数声明放到AO对象并赋值为函数体。函数名为属性名,值为函数体;逐行执行。拿的是上文中的代码示例。第一步创建AO对象查找形参和变量声明放到AO对象并赋值为undefined
;注意:fun
函数里边的b是未经var声明的,所以是全局变量,不会被放在fun
的AO上。将实参赋值到形参上查找函数声明放到AO对象并赋值为函数体,fun函数没有函数声明,所以忽略这一步。函数执行之前的预编译完成,开始执行语句执行代码首先执行打印变量b,而此时fun
的AO里边并没有变量b,所以会去GO对象里边找,此时的GO对象b的值为10,所以第一免费云主机、域名行代码打印出10;第二行代码首先要看的是b = 2
,然后GO对象里边b的值就被改为2了。然后b再赋值给a,变量a是属于局部变量a,所以fun
的AO对象里边a的值被改为2。接着下一个赋值语句是c = 123
,所以AO对象中c的值被改为了123此时再执行console.log(a)
的值就是AO对象里边a的值 2;执行console.log(b)
的值就是GO对象b的值 2,至此函数fun执行完毕,紧跟着fun的AO也会被销毁。综上所述,依次打印出来的值为:1,undefined,10,2,2
。“JavaScript预编译过程是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注云技术网站,小编将为大家输出更多高质量的实用文章!
这篇文章给大家分享的是有关PHP如何使用if…else语句的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP – if…else 语句请使用 if….else 语句在条件为 true 时执行代码,在条件为 false …