完全掌握JavaScript预编译过程

本篇文章给大家带来了关于javascript中预编译的相关知识,其中主要通过示例来介绍预编译的相关问题,希望对大家有帮助。

完全掌握JavaScript预编译过程

阶段(三个)

词法语法分析:词法语法分析就是检查JavaScript代码是否有一些低级的语法错误预编译:本文主讲执行代码:执行代码就是js引擎解析代码,解析一行执行一行

这章主要讲预编译过程

预编译过程

预编译也分为2个时间点:

第一个是在JavaScript代码执行之前第二个是在函数执行之前。

但是JavaScript代码之前,之前的预编译只发生一次,函数执行之前的预编译是多次的。

立即学习“Java免费学习笔记(深入)”;

1. JavaScript代码执行之前的预编译

JavaScript代码执行之前,首先会创建一个全局对象,可以理解为window对象,也可以理解为GO(Global Object)对象,我们是看不到的(无法打印)然后将所有声明的全局变量未使用var和let声明的变量放到GO对象中,并且赋值为undefined(联想到“变量提升”)分析**函数声明:**然后再将所有的函数声明也放到GO对象中,并且赋值为函数自身的函数体(函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖)

案例说明

    var a = 1;    console.log(a);    console.log(b);    var b = 10;    function fun (a) {        console.log(b);        var a = b = 2;        var c = 123;        console.log(a);        console.log(b);    }    var a2 = 20    fun(1); 

登录后复制

结合上面说的步骤:

首先,中的代码执行之前会创建一个GO对象(window对象)

GO = {//自带的属性都不写}

登录后复制

将所有声明的全局变量、未使用var和let声明的变量放到GO对象中,并且赋值为undefined

GO = {a : undefined,b : undefined,a2 : undefined}

登录后复制

分析函数声明,函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖

GO = {a : undefined,b : undefined,a2 : undefined,function fun (a) {    var a = b = 2;    var c = 123;  }}

登录后复制

此时完成了js代码执行之前的预编译过程,开始执行js代码,首先是给a进行赋值为1,在GO对象里边也会进行对应的改变:

GO = {a : 1,b : undefined,a2 : undefined,function fun (a) {    var a = b = 2;    var c = 123;  }}

登录后复制

然后打印a,此时会在GO对象上去找变量a,然后此时的a的值为1,所以console.log(a) 是等于1的。接着打印b,也会去GO对象上找,找到了b的值为undefined,所以console.log(b)是等于undefined。

接着执行到赋值语句:b = 10; 此时GO对象里b的值变成了10

GO = {a : 1,b : 10,a2 : undefined,function fun (a) {var a = b = 2;var c = 123;}}

登录后复制

接着下一行代码是一个**fun函数,此时不会去执行该函数**,因为在前面的预编译过程中实际上是被放到了代码的最前端,就是传说中的声明提前,所以忽略掉了。接着给a2进行赋值操作:a2 = 20,GO对象也发生变化:

GO = {a : 1,b : 10,a2 : 20,function fun (a) {var a = b = 2;var c = 123;}}

登录后复制登录后复制

接着是执行fun函数,如上面说到的另外一个时间点发生的预编译,就是执行函数之前,现在就来说一下函数执行前的预编译是怎么样的。

2. 函数执行前的预编译

函数调用,也是会生成自己的作用域(**AO:**Activetion Object,执行期上下文)AO活动对象。函数调用时候,执行前的一瞬间产生的,如果有多个函数的调用,会产生多个AO

生成AO对象:函数执行前的一瞬间,生成AO活动对象分析生成AO属性:查找形参变量声明放到AO对象,赋值为undefined分析函数声明:查找函数声明放到AO对象并赋值为函数体。函数名为属性名,值为函数体;

如果遇到AO对象上属性同名,则无情覆盖

逐行执行。

案例说明

拿的是上文中的代码示例。

第一步创建AO对象

AO{}

登录后复制

查找形参变量声明放到AO对象并赋值为undefined;

注意:fun函数里边的b是未经var声明的,所以是全局变量,不会被放在fun的AO上。

AO{a: undefined,//形参a与局部变量a同名c: undefined}

登录后复制

实参赋值到形参

AO{a: 1,c: undefined,}

登录后复制

查找函数声明放到AO对象并赋值为函数体,fun函数没有函数声明,所以忽略这一步。

函数执行之前的预编译完成,开始执行语句

执行代码

首先执行打印变量b,而此时fun的AO里边并没有变量b,所以会去GO对象里边找,此时的GO对象b的值为10,所以第一行代码打印出10;

第二行代码首先要看的是b = 2,然后GO对象里边b的值就被改为2了。

GO = {a : 1,b : 10,a2 : 20,function fun (a) {var a = b = 2;var c = 123;}}

登录后复制登录后复制

然后b再赋值给a,变量a是属于局部变量a,所以fun的AO对象里边a的值被改为2。

AO{a: 2,c: undefined,}

登录后复制

接着下一个赋值语句是c = 123,所以AO对象中c的值被改为了123

AO{a: 2,c: 123,}

登录后复制

此时再执行console.log(a)的值就是AO对象里边a的值 2;执行console.log(b)的值就是GO对象b的值 2,至此函数fun执行完毕,紧跟着fun的AO也会被销毁

综上所述,依次打印出来的值为:1,undefined,10,2,2。

完全掌握JavaScript预编译过程

总结

预编译两个小规则:

函数声明整体提升(无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)变量声明提升(无论变量调用和声明的位置是前是后,系统总会把声明移到调用前,注意仅仅只是声明,所以值是undefined)

预编译前奏

imply global(暗示全局变量-专业术语) 即:任何变量,如果未经声明就赋值,则此变量就位全局变量所有。(全局域就是window,这里再一次说明了JavaScript是基于对象的语言,base on window)一切声明的全局变量,全是window的属性;var a=12;等同于window.a = 12;(会造成window这个对象特别臃肿)函数预编译发生在函数执行前一刻(懒加载机制)

相关推荐:javascript学习教程、web前端开发视频教程

以上就是完全掌握JavaScript预编译过程的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2702940.html

(0)
上一篇 2025年3月7日 19:28:52
下一篇 2025年3月7日 19:29:00

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • html、css容易被忽略的小知识点_html/css_WEB-ITnose

    都说前端容易,谁说的。前端上手快,越往后学习越困难。学习前端快一年了,依然发现一些小的知识点不会。这些经验性的东西不碰到永远学不会。 (1)title前面的logo。 就像这个编辑文章前面的logo。不知道大家知不知道这个图标是如何加载过来…

    编程技术 2025年4月4日
    100
  • html节点属性操作

    nbsp;html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> …

    编程技术 2025年4月4日
    200
  • html教程:用tabIndex轻松实现网页导航

    最近,当我在一个网站上输入表格数据时,我填写了一栏,并点击[tab]键移到下一栏;当我抬头时,我惊奇的发现光标跳到页面下方的另一栏中。我用鼠标将光标移到正确的文本栏中,但不久[tab]键又再次出现问题。这一情形使我想了解一下页面设计,以及t…

    编程技术 2025年4月4日
    200
  • html教程:WEB标准从头开始_DOCTYPE声明

    在较早之前的网页上,我们经常可以看到如下的网页结构代码: 这是一个网页 …… 立即学习“前端免费学习笔记(深入)”; …… 立即学习“前端免费学习笔记(深入)”; 很显然的,这种结构的网页代码是不符合Web标准规范的,但是浏览器仍然可以很好…

    编程技术 2025年4月4日
    200
  • 一步步学习html—-第一课

    在讲授第一课的时候,首先要给大家表明的一个概念是:我们学习的是一门语言,而不是一个编译工具,所以我们要习惯在编写程序的时候忽略编译工具的概念,因为只有忽略了编译工具,才能真正意义上的明白一门语言的精髓在哪里,也才能真正掌握一门语言到底是怎么…

    编程技术 2025年4月4日
    200
  • 一步步学习html—-第三课

    经过前面两课的学习,不知道你们对于什么是html有没有了一定程度上的了解,今天的第三课算是第一阶段的一个总结,会加入一点新的内容,但是更多的是会做总结,好了,废话不说了,进入今天的课程吧!在前两课的基础上,这一课主要是加入了一个插入图片的问…

    编程技术 2025年4月4日
    200
  • 一步步学习html—-第四课

    这一课我们主要讲解一下链接的问题:这个也可以定义为超文本链接,标签则是这个标签的全称是anchor,中文意思是锚;例子:http://www.baidu.com”>click!在网页上就会出现一个链接,其文本表现形式就是正…

    编程技术 2025年4月4日
    200
  • HTML的分段与换行代码说明

    在网页的排版中,经常会对文本进行分段和换行的操作,这两种操作由 标签 和标签来实现。 1、 -段落标签 p是英文单词“paragraph”的首字母,用来定义网页中的一段文本, 一般是成对出现。 2、-换行标签 br是英文单词“break”的…

    编程技术 2025年4月4日
    200
  • HTML的标题设置代码

    在word文档中,标题往往都需要格外醒目,例如加粗字体较大等。同样地在html文档中也可以设置标题以同样的格式显示。 我们可以用html标题标签来设置标题,一共有6个标题标签,从 到 ,数字越小,级别越高,文字也相应越大。 下面通过实例介绍…

    编程技术 2025年4月4日
    200
  • HTML的列表代码说明

    在编辑文档时,有时希望某些内容以列表形式显示出来,是其结构化和条理化。在html文档中,html列表标签主要分为序号列表和项目列表,前者是每个列表项都有个数字编号,后者则在每个列表项前有个圆点符号。 1、序号列表(也称为有序列表) 序号列表…

    编程技术 2025年4月4日
    200

发表回复

登录后才能评论