本章我们一起讨论一下ECMAScript的执行上下文及相关可执行代码的各种类型。so...什么是执行上下文?我们来看看定义:

每次当控制器转到ECMAScript可执行代码的时候, 即会进入到一个执行上下文。 执行上下文(以下我们且称EC)是ECMA-262标准里的一个抽象概念,用于可执行代码概念进行区分。活动的执行上下文组在逻辑上组成一个堆栈。 堆栈底部永远都是全局上下文(global context), 而顶部就是当前EC。堆栈在EC类型进入和退出上下文的时候被修改(pop or push)。

可执行代码类型

可执行代码的类型这个概念与执行上下文的抽象概念是有关系的。 在某些时刻, 可执行代码与执行上下文
完全有可能是等价的。下面我们且定义EC堆栈是一个数组:

var ECStack = [];

每次执行function时(递归调用或作为构造函数调用)或内置的eval函数工作时,这个堆栈就会被压入。

全局代码

全局代码是在“程序”级处理的,比如外部引入的js文件、本地<script></script>标签中的代码。而任何function体内的代码都不是全局代码。

在初始化阶段,ECStack是这样的:

ECStack = [
globalContext
]

函数代码

当进入函数代码的时候,ECStack被压入新元素。但不包括该函数的内部函数代码。比如,我们定义一个函数,使函数递归一次:

(function func(bar){
if(bar) {
return ;
}
arguments.callee.call(null ,true);
})();

第一次执行上面代码时,ECStack是这样的:

ECStack = [
<foo> functionContext,
globalContext
]

第二次(递归调用)执行的时候,ECStack变成这样了:

ECStack = [
<foo> functionContext,
<foo> functionContext,
globalContext
]

当程序 return 的时候,就会退出当前EC,对应的ECStack会被弹出。栈指针会自己调整位置,这是典型的堆栈。一个抛出的异常如果没被截获的话也有可能从一个或多个执行上下文退出。 相

关代码执行完以后, ECStack只会包含全局上下文(global context), 一直到整个应用程序结束。

eval代码

我们这里不讨论eval性能及其他问题。这里我们只关注上下文相关,它有一个概念:calling context(调用上下文),例如:eval函数调用所产生的上下文会影响调用上下文:

eval('var x = 1');

(function(){
eval('var y = 2');
})(); console.log(x) //
console.log(y) // y is not defined

整个执行过程,ECStack变化如下:

ECStack = [
globalContext
]
//eval('var x = 1')
ECStack.push(evalContext);
ECStack = [
evalContext ,
callingContext : globalContext
];
// eval exited context
ECStack.pop();
//anonymous function
ECStack.push(<anonymous> functionContext);
//eval('var y = 2')
ECStack.push(evalContext);
//eval exited context
ECStack.pop();
// anonymous function exited context
ECStack.pop();

参考:

本文参考了大叔的“执行上下文”章节,在此基础上做了一些调整。

Execution Contexts (执行上下文)的更多相关文章

  1. Javascript 执行上下文 context&scope

    执行上下文(Execution context) 执行上下文可以认为是 代码的执行环境. 1 当代码被载入的时候,js解释器 创建一个 全局的执行上下文. 2 当执行函数时,会创建一个 函数的执行上下 ...

  2. 深入理解JavaScript系列(11):执行上下文(Execution Contexts)

    简介 从本章开始,我将陆续(翻译.转载.整理)http://dmitrysoshnikov.com/网站关于ECMAScript标标准理解的好文. 本章我们要讲解的是ECMAScript标准里的执行上 ...

  3. 你不知道的JavaScript--Item19 执行上下文(execution context)

    在这篇文章里,我将深入研究JavaScript中最基本的部分--执行上下文(execution context).读完本文后,你应该清楚了解释器做了什么,为什么函数和变量能在声明前使用以及他们的值是如 ...

  4. 理解Javascript之执行上下文(Execution Context)

    1>什么是执行上下文 Javascript中代码的运行环境分为以下三种: 全局级别的代码 - 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境. 函数级别的代码 - 当执行一 ...

  5. SQL Server安全(6/11):执行上下文与代码签名(Execution Context and Code Signing)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...

  6. 深入理解javascript执行上下文(Execution Context)

    本文转自:http://blogread.cn/it/article/6178 在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你 ...

  7. JavaScript内部原理系列-执行上下文(Execution Context)

    概要 本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型. 定义 每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文.执行上下文(简称:EC)是个抽 ...

  8. 深入理解Javascript之执行上下文(Execution Context)

    在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你就会明白javascript引擎内部在执行代码以前到底做了些什么,为什么某些函数 ...

  9. JavaScript执行上下文

    变量声明.函数声明为何会提升?js执行时是如何查找变量的?JavaScript中最基本的部分——执行上下文(execution context) 什么是执行上下文? 当JavaScript代码运行,执 ...

随机推荐

  1. 关于UPdate用法的

    updaterestore_base  set  restore_base.localcost =(select   localcost  from    [nt2000\cpi].chongia2. ...

  2. OTG线与普通USB线的区别

    转自OTG线与普通USB线的区别 USB数据线是我们常见的设备,OTG线作为近年来随着手机行业的快速发展,逐步进入了我们的日常使用范围.OTG线与普通USB线的有什么区别?       USB数据线用 ...

  3. SolrCloud阶段总结

    http://www.cnblogs.com/guozk/p/3498844.html SolrCloud阶段总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍SolrClou ...

  4. Two shortest

    sgu185:http://acm.sgu.ru/problem.php?contest=0&problem=185 题意:找两条最短路径,没有边相交的最短路劲,并且输出路径. 题解:这一题和 ...

  5. 【UVA1378】A Funny Stone Game (博弈-求SG值-输出方案)

    [题目] Description The funny stone game is coming. There are n piles of stones, numbered with 0, 1, 2, ...

  6. jinfo命令(Java Configuration Info)

    jinfo可以输出并修改运行时的java 进程的opts.用处比较简单,用于输出JAVA系统参数及命令行参数.用法是jinfo -opt  pid 如:查看2788的MaxPerm大小可以用  jin ...

  7. Java实现字符串反转

    替换原则:index k 的值和 n-k 的值进行交换.(始终记住程序员的n.k都是字符串的实际位置.) 乘除的最基本实现还是来源于移位操作. public String reverse(String ...

  8. 数据结构(莫队算法):HH的项链

    问题描述: HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变得越来越长. ...

  9. css3图片墙

    css相关知识: 1. 使用box-shadow设置图片阴影,为照片加上阴影 eg: box-shadow: 0 0 5px 3px #abc 2. 使用tansform-origin定义变形原点 e ...

  10. Android学习笔记(四)深入探讨Activity

    在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...