正如我们了解的一样,当我们书写了JS程序之后,打开浏览器,我们的代码就可以开始运行了(当然保证你的代码没有问题,才能按照你的预期进行执行)。刚才说的是JS执行的一个大的环境,今天我们学习一下,JS在解析器里的一个执行过程。
 
    这个过程分为两个阶段:
  • 进入执行上下文
  • 执行代码
    变量对象的变化,和这两个阶段息息相关。
 
    在介绍这两个阶段之前,了解相关的概念。
    如果变量和执行上下文相关,那么它应该知道在哪里存储数据和怎么访问数据,这种机制叫做变量对象(variable object,简称VO)。用于存储下列数据:
  • 变量声明
  • 函数声明(这个地方需要和函数表达式作区分)
  • 函数参数
 
    第一个阶段:进入执行上下文。此时VO将会被下面的属性初始化(按照下面的顺序进行初始化):
  • 函数参数:VO的一个属性,这个属性是有形参名称和值组成,如果没有传递实参,那就是形参的名称和undefined。
  • 函数声明:是由函数的名称和值组成,如果VO中存在该属性值,则替换这个属性。
  • 变量声明:由变量名称和undefined组成,如果变量名和VO有的函数参数或函数声明相同,则变量声明不会干扰已存在属性。
    VO的使用环境有:GlobalContext和FunctionContext。    
 
    来一个例子:

function test(a, b) {
var c = 20;
function d(){}
var e = function _e(){};
(function x(){});
}
test(30);
    
    当进入执行环境,VO如下:

 VO (test FunctionContext) = {
a: 30,
b: undefined,
d: <reference to FunctionDeclaration "d">,
c: undeifined,
e: undefined
}
 
    注:其中x 、_e都是函数表达式,_e通过变量声明e进行访问。
 
    接下来就会进入下一个阶段,执行代码阶段:
    以上面的例子来说,会经历下面的过程:

VO['c'] = 20;
VO['e'] = <reference to FunctionDeclaration "_e">;
 
    这样代码就执行完了。
 
    再来一个经典的例子:

alert(x); //function
var x = 10;
x = 20;
function x() {}
alert(x); //20
 
    为什么第一个是function,而不是undeofined或者是not defined或者10、20?因为,根据规范 — 当进入上下文时,往VO里填入函数声明;在相同的阶段,还有一个变量声明“x”,那么正如我们在上一个阶段所说,变量声明在顺序上跟在函数声明和形式参数声明之后,而且,在这个阶段,变量声明不会干扰VO中已经存在的同名函数声明或形式参数声明,因此,在进入上下文时,VO的结构如下:

VO = {}
VO['x'] = <reference to FunctionDeclaration "x">;
VO['x'] = <the value is not disturbed, still function>
 
在代码执行阶段:

V['x'] = 10;
V['x'] = 20;

  

    了解了这个过程,我相信对JS执行过程会有一个全新的理解。
 
  留一个小小的问题(猜想一下输出结果):
  

function test(a, b) {
var c = 20;
console.log(a);//结果是什么?为什么?
function a(){}
var e = function _e(){};
(function x(){});
}
test(30);
 
参考文献:
http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/
 

你了解JS执行过程吗?的更多相关文章

  1. js执行过程

    正如我们了解的一样,当我们书写了JS程序之后,打开浏览器,我们的代码就可以开始运行了(当然保证你的代码没有问题,才能按照你的预期进行执行).刚才说的是JS执行的一个大的环境,今天我们学习一下,JS在解 ...

  2. 图文带你看懂JavaScritpt引擎V8与JS执行过程

    浏览器原理 浏览器内核与js引擎 浏览器内核又称"排版引擎","渲染引擎","浏览器引擎",叫法很多,简单来说干的活就是将代码(HTML,X ...

  3. 【JS】js引擎执行过程

    概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...

  4. (转载)js引擎的执行过程(二)

    概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...

  5. javascript代码解释执行过程

    javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解 ...

  6. js执行环境相关

    Js执行过程 如果一个文档中存在多个代码段 步骤一:读入第一个代码段(js引擎并非一行一行执行,而是一段一段分析执行) 步骤二:做词法分析和语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤 ...

  7. 深入学习JS执行--单线程的JS

    一.介绍 随着js不断学习,你可能会慢慢的好奇,用了这么久的js,却不知道这js在浏览器怎么被执行的,很尴尬.所以,我查阅很多资料来总结JS的执行过程,也分享出来,和大家一起学习. 本篇主要讲单线程的 ...

  8. 深入学习JS执行--创建执行上下文(变量对象,作用域链,this)

    一.介绍 本篇继上一篇深入理解js执行--单线程的JS,这次我们来深入了解js执行过程中的执行上下文. 本篇涉及到的名词:预执行,执行上下文,变量对象,活动对象,作用域链,this等 二.预执行 在上 ...

  9. 深入浅出的JS执行机制(图文教程)

    前序 作为一个有理想有抱负的前端攻城狮,想要走向人生巅峰,我们必须将我们使用的功法练到天人合一的地步.我在们日常工作中,使用最多的语言就是JavaScript了,为了写出完美的.能装逼的代码,我们必须 ...

随机推荐

  1. paip.sql索引优化----join 代替子查询法

    paip.sql索引优化----join 代替子查询法 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...

  2. 【每天一个Linux命令】19. 创建文件夹目录命令mkdir

    命令用途 mkdir 命令用来创建指定的名称的目录 使用说明 1.  创建目录的用户在当前目录中具有写权限 2. 指定的目录名不能是当前目录中已有的目录. 命令实例 0. 帮助文件 bixiaopen ...

  3. PC-CSS-多浏览器支持HTML5

    非IE:article, section, aside, hgroup, nav, header, footer, figure, figcaption {display: block;}IE:< ...

  4. JavaScript 精髓整理篇之一(对象篇)postby:http://zhutty.cnblogs.com

    废话篇头: 由于工作关系,所以写博文的时间有那么点~~,其实是输入法太懒了,都是输入法的错~~ 这一系列的博客将总结所有关于JavaScript语言的精髓,适合0基础到大师级别人物阅读. <Ja ...

  5. Operation System - Peterson&#39;s Solution算法 解决多线程冲突

    Person's solution 是用来一种基于软件的解决关键区域问题的算法(critical-section). 它并不是完美的,有可能不对地工作.并且是限制解决两个进程同步的问题. 可是它非常e ...

  6. Android 避免APP启动闪黑屏的解决办法(Theme和Style)

    前几天Boss就反应说,机器每次启动程序都会闪一下黑屏,这个客户不接受.没办法,只能想想怎么解决,最后找到了下面的方法.闪黑屏的原因主要是我们启动Activity的时候,需要跑完onCreate和on ...

  7. 安装VMware Sphere ESXi 5.5

    安装VMware Sphere ESXi 5.5 1.准备 待安装ESXi 5.5的机器需要大于2GB以上内存,并且支持64位和虚拟化. 下载:VMware-VMvisor-Installer-5.5 ...

  8. oracle学习笔记(二)表的查询

    --oracle表的管理 --创建表 )); --删除表 drop table users; --创建表 ),xm ),sex ),birthday date,sal ,)); ),cnmae )); ...

  9. ssh maven 搭建

    数据库建表脚本不带,是很简单的一个表,把数据库环境搭建起来即可. 1.项目结构(Eclipse) 2.pom.xml <project xmlns="http://maven.apac ...

  10. java必备基础知识(一)

    学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...