重学JavaScript深入理解系列

栏目: JavaScript · 发布时间: 6年前

内容简介:每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文。 执行上下文(简称:EC) 以后出去要说EC因为够逼格:smirk: EC是个抽象的概念,ECMA-262标准中用它来区分不同类型的可执行代码。一系列活动的执行上下文从逻辑上形成一个栈。栈底是全局上下文,栈顶是当前(活动的)执行上下文。当在不同的执行上下文切换的时候,栈会被修改(通过压栈或者退栈的形式)。每次控制器进入一个函数(哪怕该函数被递归调用或者作为构造器),都会发生压栈的操作。内置eval函数工作的时候也不例外

每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文。 执行上下文(简称:EC) 以后出去要说EC因为够逼格:smirk: EC是个抽象的概念,ECMA-262标准中用它来区分不同类型的可执行代码。

标准中并没有从技术实现的角度来定义可执行上下文的具体结构和类型;这是现实标准的ECMAScript引擎所要考虑的问题。

一系列活动的执行上下文从逻辑上形成一个栈。栈底是全局上下文,栈顶是当前(活动的)执行上下文。当在不同的执行上下文切换的时候,栈会被修改(通过压栈或者退栈的形式)。

可执行代码类型

可执行代码类型和执行上下文相关。有的时候,当提到代码类型的时候,其实就是在说执行上下文。

举个:chestnut: 我们将执行上下文的栈以数组的形式来表示

ECStask =[];
复制代码

每次控制器进入一个函数(哪怕该函数被递归调用或者作为构造器),都会发生压栈的操作。内置eval函数工作的时候也不例外

全局代码

这类代码是在"程序"级别上被处理的:比如,加载一个外部的js文件或者内联的js代码(被包含在script标签内).全局代码不包含任何函数体内的代码。 在初始化的时候(程序开始的时候) ECStack如下
ECStask =[
    globalContext
];
复制代码

函数代码

一旦控制器进入函数代码(各类函数),就会有新的元素会被压栈到ECStack。

要注意的是:实体函数代码并不包括内部函数代码。

如下所示,我们调用一个函数,该函数递归调用自己一次:

(function foo(bar){
      if(bar){
          return;
      }  
      foo(true);
    })();
复制代码

之后, ECStack就被修改成如下所示:

// 首先激活foo函数
ECStack = [
    functionContext
    globalContext
]

// 递归激活foo函数
ECStack = [
    functionContext - recursively
    functionContext 
    globalContext
]
复制代码

每次函数返回,退出当前活动的执行上下文时,ECStack就会被执行对应的退栈操作--(先进后出和传统的栈实现一致)。

同样的,当抛出未捕获的异常时,也会退出一个或者多个执行上下文,ECStack也会做相应的退栈操作。

待这些代码完成之后,ECStack中就只剩下一个执行上下文(globalContext)直到整个程序结束。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

世界因你不同

世界因你不同

李开复、范海涛 / 中信出版社 / 2010 / 29.8

这是李开复唯一的一本自传,字里行间,是岁月流逝中沉淀下来的宝贵的人生智慧和职场经验。捣蛋的“小皇帝”,11岁的“留学生”,奥巴马的大学同学,26岁的副教授,33岁的苹果副总裁,谷歌中国的创始人,他有着太多传奇的经历,为了他,两家最大的IT公司对簿公堂。而他的每一次人生选择,都是一次成功的自我超越。   透过这本自传,李开复真诚讲述了他鲜为人知的成长史、风雨兼程的成功史和烛照人生的心灵史,也首次全面......一起来看看 《世界因你不同》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具