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. 转载:爱加密邀您参加5月17日深圳App开发沙龙活动

    听闻,移动互联网的九大门派已集结在一起,各路顶尖高手携App修炼宝典九阴真经现身,一场席卷全国的App修炼风暴即将来临.5月17日,以“移动开发者如何白手起家.快速盈利”为主题的沙龙活动将在深圳市南山 ...

  2. 好的Unix工具的九大启发

    我们每天都在使用前人开发的各种工具. 一款好的工具能无缝地融入到你的工作环境中,而一款"差"的工具经常须要花费额外的精力才干集成到你的工作环境中. (注意:这里的差是指用户体验方面 ...

  3. [luogu P3360] 偷天换日 解题报告(树形DP)

    题目链接:https://www.luogu.org/problemnew/show/P3360 题解: 首先我们把边上的消耗放到向下的点上,如果是叶子节点的话就先做一次0/1背包 发现这是一颗二叉树 ...

  4. Dictionaries and tuples

    Dictionaries have a method called items that returns a list of tuples, where each tuple is a key-val ...

  5. [-] Failed to load plugin from /usr/share/metasploit-framework/plugins/db_autopwn: No classes were loaded from /usr/share/metasploit-framework/plugins/db_autopwn in the Msf::Plugin namespace.

    问题详情 然后,执行,出现如下问题,则说明大家的这个文件,下载不是完整的或者你上传不完整. msf > load db_autopwn [-] Failed to load plugin fro ...

  6. Windows 相关

    Open the Windows Update troubleshooter If your computer is having problems finding and installing op ...

  7. vuejs v-model

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. jsLittle源码封装对象

    window.JSLi = ((function(){ var JSLi = function(selector) { return new JSLi.fn.init(selector); }; JS ...

  9. codeforces 527 C Glass Carving

    Glass Carving time limit per test 2 seconds Leonid wants to become a glass carver (the person who cr ...

  10. C#派生类中使用基类protected成员的方法

    我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被prot ...