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预编译和函数执行的更多相关文章

  1. JS预编译详解

    我们都知道javascript是解释型语言,执行的特点呢是编译一行,执行一行.按照这个思路有时候我们在运行代码时会有一些令人费解的现象出现.下面我们一起来执行下面三段代码. <script> ...

  2. 关于js预编译以及js文件执行顺序的几个问题。

    关于js的执行原理,除去html页面中直接添加的代码,js代码的放置可以分为两类. //情形a           <script type="text/javascript" ...

  3. js预编译

    先来做三个测试 eg1: var a; a = 1; function a() {}; console.log(a); eg2: var a; function a() {}; console.log ...

  4. Javascript - 预编译与函数词法作用域

    预编译与函数词法作用域(Precompiled & Scoped) 预编译 Javascript脚本的宿主在执行代码之前对脚本做了预编译处理,比如浏览器对Js进行了预编译,编译器会扫描所有的声 ...

  5. js预编译的四部曲

    众所周知javascript是解释性语言,主要特点为解释一行执行一行. 而在js运行时会进行三件事:1语法分析  2.预编译  3.解释执行 语法分析会在代码执行前对代码进行通篇检查,以排除一些低级错 ...

  6. js 预编译

    js 运行代码的时候分为几个步骤:语法分析 ==>预编译  ==>解释执行 语法解析:通篇扫描代码,查看语法是否出错 解释执行:读一行 - 解释一行 - 执行一行 预编译执行的操作: // ...

  7. Handlebars.js 预编译(转)

    Handlebars.js 官网上对预编译1是这样说的: 你需要安装 Node.js 你需要在全局环境中,通过 Npm 安装 handlebars 包 然后你就可以通过命令预编译你的 handleba ...

  8. 5.js与jQuery入口函数执行时机

    js与jQuery入口函数执行时机区别: JS入口函数是在所有资源加载完成后,才执行.(包括:页面.外部js文件.外部css文件.图片) jQuery入口函数,是在文档加载完成后就执行.文档加载完成指 ...

  9. js预编译环节 变量声明提升 函数声明整体提升

    预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a) ...

随机推荐

  1. openssh 升级到7.5p1

    1. 参照: http://www.cnblogs.com/xiegj/p/5669800.html http://blog.csdn.net/u011080082/article/details/5 ...

  2. MapReduce 的类型与格式【编写最简单的mapreduce】(1)

    hadoop mapreduce 中的map 和reduce 函数遵循下面的形式 map: (K1, V1) → list(K2, V2) reduce: (K2, list(V2)) → list( ...

  3. EJB3.0高速入门项目开发步骤

    EJB3.0开发步骤 1.   开发环境 IDE开发工具:Eclipse Java EE IDE for Web Developers EJB容器:jboss-4.2.3.GA 后台数据库:MysQL ...

  4. Linux 经常使用快捷键

    桌面下: Alt+F5   取消最大化窗体 Alt+F9   最小化窗体  Alt+F10  最大化窗体  Alt+空格 打开窗体的控制菜单 (点击窗体左上角图标出现的菜单)     ctl+r   ...

  5. MyBatis的架构设计以及实例分析--转

    原文地址:http://blog.csdn.net/luanlouis/article/details/40422941 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单 ...

  6. RelativeLayout中的baseline

    比如,加入两个相邻的TextView,给第二个TextView一个大一点的padding(比如20dp),如果加了layout_alignBaseline到第二个TextView中的话, TextVi ...

  7. 关于node的聊天室错误

    Deprecationwarning:process,EventEmitter is deprecated use require ('events')instead 关于node的聊天室错误 > ...

  8. links[v1]

    justep core java Spring Boot ui5 template spring Cross-origin resource sharing 统一异常处理 数据库连接池的选择 Drui ...

  9. MFC 创建新项目

    本文主要介绍如何是使用vc++创建MFC项目,并简单介绍整个项目的基本框架.文件–>新建,会弹出以下新建文件(项目)类型的界面,如下 按上图的步骤u,创建一个MFC工程.其中步骤3中的CardD ...

  10. 十五 Canny边缘检测算法

    一.Canny算法介绍 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边缘要尽可能与实际图像中的实 ...