JavaScript的预编译过程分析
时间:2022-07-28
本文章向大家介绍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);
你可以先试想一下结果,然后复制代码到控制台去验证你的答案是否正确。
- 在win2008 r2中安装windows phone 7开发工具
- TFS2008 + Windows2003 + Sql2005 安装注意事项
- 机器学习(五)——k-近邻算法进一步探究
- openstack上创建vm实例后,状态为ERROR问题解决
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(5)--问题解决
- 全国首创!今天起,杭州“刷”的一下就能直接乘地铁
- 2018年前端技术趋势预览
- SQL SERVER 内存分配及常见内存问题 简介
- 深入浅出事件流处理NEsper(一)
- 微软官方提供的用于监控MS SQL Server运行状况的工具及SQL语句
- 生成人工智能:创意专家新的强大工具
- JavaScript能做什么?
- SQL中利用DMV进行数据库性能分析
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)--基础环境搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Tree - 337. House Robber III
- Tree - 250. Count Univalue Subtrees
- Tree - 124. Binary Tree Maximum Path Sum
- Tree - 110. Balanced Binary Tree
- Tree - 104. Maximum Depth of Binary Tree
- Tree - 298. Binary Tree Longest Consecutive Sequence
- Tree - 111. Minimum Depth of Binary Tree
- Tree - 129. Sum Root to Leaf Numbers
- Tree - 113. Path Sum II
- DFS&BFS - 200. Number of Islands
- Backtracking - 93. Restore IP Addresses
- Backtracking - 17. Letter Combinations of a Phone Number
- Backtracking - 60. Permutation Sequence
- Backtracking - 47. Permutations II
- Backtracking - 46. Permutations