本章我们一起讨论一下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. JavaScript 语句后应该加分号么?

    分号加与不加完全取决于个人习惯,但为了代码稳定(解析出错)还是建议使用分号断句. JavaScript自动加分号规则:1.当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹 ...

  2. spm使用之六安装别人写好的spm文档主题模板

    上回说到有个nico-one的文档主题模板, https://github.com/lepture/nico-one 把他可以下载了, 放到 C:\Documents and Settings\Adm ...

  3. Spring 操作Weblogic JDNI数据源

    <!--Data Source--> <jee:jndi-lookup id="nssb_1122_cs" jndi-name="jdbc/nssb_1 ...

  4. The Lost Art of C Structure Packing

    对齐要求 首先需要了解的是,对于现代处理器,C编译器在内存中放置基本C数据类型的方式受到约束,以令内存的访问速度更快. 在x86或ARM处理器中,基本C数据类型通常并不存储于内存中的随机字节地址.实际 ...

  5. German Collegiate Programming Contest 2013:E

    数值计算: 这种积分的计算方法很好,学习一下! 代码: #include <iostream> #include <cmath> using namespace std; ; ...

  6. 【Java】Java Platform

    The Java platform has two components: The Java Virtual Machine The Java Application Programming Inte ...

  7. RH的NFS配置--简单OK

    参照文档: http://wenku.baidu.com/link?url=SAcDvj8WtBd8dunC7P6FTFADYYVzzxhOiNJqbgr-aGTZovM0lHg-wbYgv9I3Lu ...

  8. 【UVA11294】Wedding (2-SAT)

    题意: 有N-1对夫妻参加一个婚宴,所有人都坐在一个长长的餐桌左侧或者右侧,新郎和新娘面做面坐在桌子的两侧.由于新娘的头饰很复杂,她无法看到和她坐在同一侧餐桌的人,只能看到对面餐桌的人.任意一对夫妻不 ...

  9. MYSQL常用命令集合

    1.导出整个数据库 mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1) mysqld ...

  10. VC6.0 list sort出错

    在STL中,排序是个很重要的话题. 1.algorithm 里的sort()只接收RandomAccessIterator用于像vector,dequeue的排序 2.像set,map,这种关联式容器 ...