JavaScript的预编译过程分析
一、JavaScript概念
JavaScript ( JS ) 是一个单线程、解释型的编程语言。
二、JavaScript语言特点
2.1 单线程
JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。
2.2 解释型语言
自上而下,解释一行,执行一行;不会通篇编译为一个文件再执行。
三、 JavaScript执行过程
3.1 语法分析
顾名思义 就是检查一遍js代码内有没有出现语法错误(比如少些个分号,多写个括号等);语法分析期间不会执行代码
3.2 预编译
预编译发生在函数执行的前一刻 全局下: 全局的变量声明和函数声明则会存放在全局对象内(Global Object 简称GO,它是window的一部分,你可以直接把他理解成window对象)中 函数体内: 预编译会提前把函数里的变量声明和函数声明依据规则存放在该活动对象内(Activation Object,简称AO),
预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 。
预编译大致可分为4步:
- 创建AO(GO)对象
- 找形参和变量声明,将形参和变量名作为AO(GO)属性名,值为undefined
- 将实参值和形参统一
- 在函数体里面找函数声明,值赋予函数体。
所以如果遇到下面这种情况,当函数声明和变量声明名称相同时:
console.log(a);
var a= 1;
function a(){};
复制代码
编译后的代码其实是:
var a;
function a(){};
console.log(a);
a= 1;
复制代码
所以最后输出的是:
function a() {}
复制代码
预编译小节
预编译两个小规则
- 函数声明整体提升—(具体点说,无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)
- 变量 声明提升—(具体点说,无论变量调用和声明的位置是前是后,系统总会把声明移到调用前,注意仅仅只是声明,所以值是undefined),只有在解释执行阶段才会进行变量初始化,匿名函数不参与预编译。
预编译前奏
- imply global 即任何变量,如果未经声明就赋值,则此变量就位全局变量所有(全局域就是window) 。
- 一切声明的全局变量,全是window的属性。
<script>var a=2; console.log(window.a);//2
</script>
复制代码
3.3 解释执行
预编译完毕之后,JavaScript 脚本开始执行,执行顺序按照从上到下的顺序执行。
总结
JavaScript执行顺序
- 语法分析
- 预编译
2.1. 创建AO(GO)对象
2.2. 找形参和变量声明,将形参和变量名作为AO(GO)属性名,值为undefined
2.3. 将实参值和形参统一
2.4. 在函数体里面找函数声明,值赋予函数体。 - 解释执行
练习:
function a(a){console.log(a);a= 2;console.log(b);var b= 3;console.log(a);
}
a(1);
console.log(a);
复制代码
你可以先试想一下结果,然后复制代码到控制台去验证你的答案是否正确。
转载于:https://juejin.im/post/5c0f6e61f265da612577f4c3
JavaScript的预编译过程分析相关推荐
- JavaScript的预编译及执行顺序
从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序. 如果说,JavaScript引擎的工作机制比较深奥是 ...
- javascript之预编译
首先要记住:预编译发生在函数执行的前一刻 先来一个小知识: 函数声明整体提升 test(); function test(){...//省略n行代码 } 在预编译阶段,会把函数声明提升到代码顶部: f ...
- Javascript作用域原理---预编译
问题的提出 首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); ...
- javascript运行过程中的“预编译阶段”和“执行阶段”
javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段 而在javascript中也有类似的"预编译阶段"(javascrip ...
- JS中的预编译(词法分析)阶段和执行阶段
javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的"预编译阶段"(javascrip ...
- 5单个编译总会编译全部_5分钟读懂JavaScript预编译
大家都知道JavaScript是解释型语言,既然是解释型语言,就是编译一行,执行一行,那又何来预编译一说呢?脚本执行js引擎都做了什么呢?今天我们就来看看吧. 1-JavaScript运行三部曲 语法 ...
- JavaScript作用域原理——预编译
JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程.并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数 ...
- javascript代码块概念及预编译机制
JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行.如果你不能理解javaScript语言的运行机制,或者简单地 ...
- JavaScript预编译
前言:在JavaScript中存在一种预编译的机制,这也是Java等一些语言中没有的特性,也就正是因为这个预编译的机制,导致了js中变量提升的一些问题,下面这两句话能解决开发当中一部份问题,但不能解决 ...
- JavaScript预编译过程
JavaScript预编译过程 阶段(三个) 预编译过程 1. JavaScript代码执行之前的预编译 案例说明 2. 函数执行前的预编译 案例说明 总结 预编译两个小规则: 预编译前奏 阶段(三个 ...
最新文章
- Makefile (2) gdb
- python自学需要哪些基础知识-零基础学Python应该学习哪些入门知识及学习步骤安排...
- 基于消息队列 RocketMQ 的大型分布式应用上云较佳实践
- ubuntu创建新用户并设置sudo权限
- 从FM推演各深度学习CTR预估模型
- 什么是SAP CRM的Custom Transaction Context
- java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...
- sixxpack破解的文章!【转】
- 围观人类弹琴后,Facebook的AI学会了假装演奏
- Aduino驱动SSD1306 OLED 显示图像
- 微信小程序倒计时功能
- java代码对图片缩放
- Leo:一个outlining editor
- Python 进化算法的简单介绍和实现
- IP对亚马逊测评自养号有多重要?
- 五 常见的计算机故障有哪些,笔记本电脑常见故障有哪些 笔记本电脑常见故障问题大全分析...
- 姜奇平:互联网带来了商业文化的变革
- Parlay/OSA-创建无线业务的一种新途径
- E02-Couldn't find device with uuid
- 在Mac下安装nvm管理node 1
热门文章
- Atitit 未来 技术趋势 没落技术 attilax著 艾龙 总结 1. 2018技术趋势	2 1.1. 人工智能与区块链	2 1.2. 2、 PWA 或将大热	2 1.3. 5、
- Atitit. Xss 漏洞的原理and应用xss木马
- paip java.net.SocketException No buffer space available的解决办法及总结
- 石川:未知风险,错误定价,还是数据迁就?
- 得寸进尺的摩根大通 步步为营
- 关于理财、专户、基金与避税
- (转)知乎:一文读懂比特币私钥、公钥、钱包地址的来历和关系
- 如果让AI来续写这些小说……
- 阿里云 cGPU 容器技术白皮书
- 我和Linux,不得不说的故事