js预编译和函数执行
javascript 执行过程
1.语法检测(有没有基本的语法错误,例如中文,关键字错误...)
2.词法分析(预编译)
(1)创建全局GO(global object)对象
(2)对var声明的变量进行声明提升但不赋值,放入GO对象中
(3)对函数体整体进行提升,放入GO对象中
3.逐行执行
一.全局 直接是script标签中的代码,不包括函数执行
<script type="text/javascript">
console.log(a); var a = 100;
console.log(a) var b = 200
var c = 300
function a(){ }
function fun(){ }
</script>
执行前:
1.首先生成一个GO(global object)对象,看不到,但是可以模拟出来用来分析
GO = {
...//省略自带属性
}
2.分析变量声明,变量名为属性名,值为undefined
GO = {
a : undefined,
b : undefined,
c : undefined
}
3.分析<b>函数声明</b>,函数名为属性名,值为函数体,如果函数名和变量名相同,则将其覆盖
GO = {
a : function a(){
},
b : undefined,
c : undefined,
fun : function fun(){
}
}
此时,GO就是预编译完成的最终对象,词法分析结束
4.逐行执行,分析过变量声明,函数声明,这里就不用管了,只管赋值(变量赋值)
当执行到“var a = 100;”的时候,a赋了一次值,值改变为100
GO = {
a : 100,
b : undefined,
c : undefined,
fun : function fun(){
}
}
所以代码的执行结果是:

二.函数执行时
函数执行时
创建AO对象 activation object
找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
将实参和形参统一
在函数体里面找到函数声明,值赋予函数体
function test(){
console.log(b);
if(a){ //undefined转换成false
var b = 100;
}
c = 123;
console.log(c);
}
var a;
test();
a = 20;
test();
console.log(c);
执行过程:
生成GO
GO = {
}
变量声明
GO = {
a : undefined
}
函数声明
GO = {
a : undefined,
test : function
}
逐行执行;
test调用,生成test.AO ={}
参数 没有,跳过
变量声明
test.AO = {
b : undefined
}
函数声明 没有,跳过
得到结果
test.AO = {
b : undefined
}
逐行执行
改变GO
GO = {
a : undefined,
test : function,
c : 123
}
a值发生改变
GO = {
a : 20,
test : function,
c : 123
}
test调用 生成test.AO={}
参数 没有 跳过
变量声明
test.AO = {
b : undefined
}
函数声明 没有
结果
test.AO = {
b : undefined
}
逐行执行
test.AO = {
b : 100
}
执行结果:

js预编译和函数执行的更多相关文章
- JS预编译详解
我们都知道javascript是解释型语言,执行的特点呢是编译一行,执行一行.按照这个思路有时候我们在运行代码时会有一些令人费解的现象出现.下面我们一起来执行下面三段代码. <script> ...
- 关于js预编译以及js文件执行顺序的几个问题。
关于js的执行原理,除去html页面中直接添加的代码,js代码的放置可以分为两类. //情形a <script type="text/javascript" ...
- js预编译
先来做三个测试 eg1: var a; a = 1; function a() {}; console.log(a); eg2: var a; function a() {}; console.log ...
- Javascript - 预编译与函数词法作用域
预编译与函数词法作用域(Precompiled & Scoped) 预编译 Javascript脚本的宿主在执行代码之前对脚本做了预编译处理,比如浏览器对Js进行了预编译,编译器会扫描所有的声 ...
- js预编译的四部曲
众所周知javascript是解释性语言,主要特点为解释一行执行一行. 而在js运行时会进行三件事:1语法分析 2.预编译 3.解释执行 语法分析会在代码执行前对代码进行通篇检查,以排除一些低级错 ...
- js 预编译
js 运行代码的时候分为几个步骤:语法分析 ==>预编译 ==>解释执行 语法解析:通篇扫描代码,查看语法是否出错 解释执行:读一行 - 解释一行 - 执行一行 预编译执行的操作: // ...
- Handlebars.js 预编译(转)
Handlebars.js 官网上对预编译1是这样说的: 你需要安装 Node.js 你需要在全局环境中,通过 Npm 安装 handlebars 包 然后你就可以通过命令预编译你的 handleba ...
- 5.js与jQuery入口函数执行时机
js与jQuery入口函数执行时机区别: JS入口函数是在所有资源加载完成后,才执行.(包括:页面.外部js文件.外部css文件.图片) jQuery入口函数,是在文档加载完成后就执行.文档加载完成指 ...
- js预编译环节 变量声明提升 函数声明整体提升
预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a) ...
随机推荐
- 洛谷 P2027 bf
P2027 bf 题目描述 bf是一种编程语言,全称为BrainFuck,因为题目名称不能太露骨,所以就简写成bf了. 这种语言的运行机制十分简单,只有一个大小为30000的有符号8位整数(范围[-1 ...
- maven手动增加jar文件
maven手动增加jar文件 在cmd界面输入: mvn install:install-file -Dfile=D:\com.ibm.mq.jar -DgroupId=com.ibm.mq -Dar ...
- Yocto tips (15): Yocto中的包管理器
使用包管理器 在local.conf中使能就可以: 然后编译后就会有rpm包了: 配置文件server 能够使用ngix和apache.可是我们也能够仅仅用使用python: python -m Si ...
- VS C/C++ 调用lua库(编译出错)
导入 lua.h 之类的头文件后,编译含有Lua函数的时候,可能会出现如下错误: 1>main.obj : error LNK2019: 无法解析的外部符号_luaL_checkinteger, ...
- 虚拟机下安装mysql
虚拟机下CentOS6.8下安装MYSQL5.6 方法: 整理修改于 http://www.cnblogs.com/liuyi2614/p/6382183.html 开始时: 普通用户是$ root用 ...
- PostgreSQL Replication之第七章 理解Linux高可用(3)
7.3 高可用软件的历史 有大量的专有的和开源的高可用性软件.专有的例子有:Solaris Cluster (有时称为Sun 集群 or SunCluster), SteelEye LifeKeepe ...
- java必会的英语单词
Java开发常用英语单词表 第一章:public['pʌblik] 公共的,公用的static['stætik] 静的;静态的;静止的void:[vɔid] 空的main:[mein] 主要的 重 ...
- UVa 216 Getting in Line【枚举排列】
题意:给出n个点的坐标,(2<=n<=8),现在要使得这n个点连通,问最小的距离的和 因为n很小,所以可以直接枚举这n个数的排列,算每一个排列的距离的和, 保留下距离和最小的那个排列就可以 ...
- redis动态修改参数
通过 config get 命令可以查看参数. 通过config set 可以修改某些参数 动态关闭redis的aof功能:(不要忘了也修改配置文件中的aof选项使其保持一致) 127.0.0.1:6 ...
- python 自动广播机制 (broadcasting)
一定要注意,执行 broadcast 的前提在于,两个 ndarray 执行的是 element-wise(按位加,按位减) 的运算,而不是矩阵乘法的运算,矩阵乘法运算时需要维度之间严格匹配.(且矩阵 ...