实例讲解JavaScript预编译流程


Posted in Javascript onJanuary 24, 2019

大家都知道JavaScript是解释型语言,既然是解释型语言,就是编译一行,执行一行,那又何来预编译一说呢?脚本执行js引擎都做了什么呢?今天我们就来看看吧。

1-JavaScript运行三部曲

语法分析

预编译

解释执行

语法分析很简单,就是引擎检查你的代码有没有什么低级的语法错误; 解释执行顾名思义便是执行代码了; 预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 ;

2-JS预编译什么时候发生

预编译到底什么时候发生? 误以为预编译仅仅发生在script内代码块执行前 这倒并没有错 预编译确确实实在script代码内执行前发生了 但是它大部分会发生在函数执行前

3-实例分析

先来区分理解一下这2个概念: 变量声明 var ... 函数声明 function(){}

<script>
var a = 1;
console.log(a);
function test(a) {
 console.log(a);
 var a = 123;
 console.log(a);
 function a() {}
 console.log(a);
 var b = function() {}
 console.log(b);
 function d() {}
}
var c = function (){
console.log("I at C function");
}
console.log(c);
test(2);
</script>

分析过程如下:

页面产生便创建了GO全局对象(Global Object)(也就是window对象);

第一个脚本文件加载;

脚本加载完毕后,分析语法是否合法;

开始预编译 查找变量声明,作为GO属性,值赋予undefined; 查找函数声明,作为GO属性,值赋予函数体;

预编译

//抽象描述
  GO/window = {
    a: undefined,
    c: undefined,
    test: function(a) {
      console.log(a);
      var a = 123;
      console.log(a);
      function a() {}
      console.log(a);
      var b = function() {}
      console.log(b);
      function d() {}
    }
  }

解释执行代码(直到执行调用函数test(2)语句)

//抽象描述
  GO/window = {
    a: 1,
    c: function (){
      console.log("I at C function");
    }
    test: function(a) {
      console.log(a);
      var a = 123;
      console.log(a);
      function a() {}
      console.log(a);
      var b = function() {}
      console.log(b);
      function d() {}
    }
  }

执行函数test()之前,发生预编译
创建AO活动对象(Active Object);

查找形参和变量声明,值赋予undefined;

实参值赋给形参;

查找函数声明,值赋予函数体;

预编译之前面1、2两小步如下:

//抽象描述
  AO = {
    a:undefined,
    b:undefined,
  }

预编译之第3步如下:

//抽象描述
    AO = {
      a:2,
      b:undefined,
    }

预编译之第4步如下:

//抽象描述
  AO = {
    a:function a() {},
    b:undefined
    d:function d() {}
  }

执行test()函数时如下过程变化:

//抽象描述
  AO = {
    a:function a() {},
    b:undefined
    d:function d() {}
  }
  --->
  AO = {
    a:123,
    b:undefined
    d:function d() {}
  }
  --->
  AO = {
    a:123,
    b:function() {}
    d:function d() {}
  }

执行结果:

实例讲解JavaScript预编译流程

注意:

预编译阶段发生变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 ; 只有在解释执行阶段才会进行变量初始化 ;

预编译(函数执行前)

创建AO对象(Active Object)

查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined

实参形参相统一,实参值赋给形参

查找函数声明,函数名作为AO对象的属性,值为函数引用

预编译(脚本代码块script执行前)
查找全局变量声明(包括隐式全局变量声明,省略var声明),变量名作全局对象的属性,值为undefined

查找函数声明,函数名作为全局对象的属性,值为函数引用

预编译小结

预编译两个小规则

函数声明整体提升-(具体点说,无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)

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

预编译前奏

imply global 即任何变量,如果未经声明就赋值,则此变量就位全局变量所有。(全局域就是Window)

一切声明的全局变量,全是window的属性; var a = 12;等同于Window.a = 12;

函数预编译发生在函数执行前一刻。

Javascript 相关文章推荐
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
获取HTML DOM节点元素的方法的总结
Aug 21 Javascript
DIV外区域Click后关闭DIV的实现代码
Dec 21 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
Apr 24 Javascript
jQuery中:password选择器用法实例
Jan 03 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
Feb 05 Javascript
原生JS实现ajax与ajax的跨域请求实例
Dec 01 Javascript
jQuery+ajax读取json数据并按照价格排序示例
Mar 28 jQuery
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
Apr 30 Javascript
微信小程序实现拍照画布指定区域生成图片
Jul 18 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 Javascript
js实现圆形菜单选择器
Dec 03 Javascript
实例讲解vue源码架构
Jan 24 #Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 #Javascript
JavaScript私有变量实例详解
Jan 24 #Javascript
小程序从手动埋点到自动埋点的实现方法
Jan 24 #Javascript
JavaScript递归函数定义与用法实例分析
Jan 24 #Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 #jQuery
vue结合element-ui使用示例
Jan 24 #Javascript
You might like
php横向重复区域显示二法
2008/09/25 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
php获取apk包信息的方法
2014/08/15 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
python实现公司年会抽奖程序
2019/01/22 Python
python实现石头剪刀布程序
2021/01/20 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
什么是唯一索引
2015/07/05 面试题
往来会计岗位职责
2013/12/19 职场文书
体育教育专业自荐信范文
2013/12/20 职场文书
安全生产检讨书
2014/01/21 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技