JavaScript内部原理系列-执行上下文(Execution Context)
概要
本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型。
定义
每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文。
执行上下文(简称:EC)是个抽象的概念,ECMA-262标准中用它来区分不同类型的可执行代码。
标准中并没有从技术实现的角度来定义执行上下文的具体结构和类型;这是实现标准的ECMAScript引擎所要考虑的问题。
一系列活动的执行上下文从逻辑上形成一个栈。栈底总是全局上下文,栈顶是当前(活动的)执行上下文。当在不同的执行上下文间切换(退出的而进入新的执行上下文)的时候,栈会被修改(通过压栈或者退栈的形式)。
可执行代码类型
可执行代码类型和执行上下文相关。有的时候,当提到代码类型的时候,其实就是在说执行上下文。
举个例子,我们将执行上下文的栈以数组的形式来表示:
ECStask = [ ];
每次控制器进入一个函数(哪怕该函数被递归调用或者作为构造器),都会发生压栈的操作。内置eval函数工作的时候也不例外。
全局代码
这类代码是在“程序”级别上被处理的:比如,加载一个外部的js文件或者内联的js代码(被包含在<script></script>标签内)。全局代码不包含任何函数体内的代码。
在初始化的时候(程序开始),ECStack如下所示:
ECStack = [
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)——直到整个程序结束。
Eval代码
说到eval代码就比较有意思了。这里要提到一个叫做调用上下文的概念,比如:调用eval函数时候的上下文,就是一个调用上下文,eval函数中执行的动作(例如:变量声明或者函数声明)会影响整个调用上下文:
eval(‘var x = 10’);
(function foo(){
eval(‘ var y = 20’);
})();
alert(x); // 10
alert(y); // ”y” is not defined
ECStack会被修改为:
ECStack = [
globalContext
];
//eval(‘var x = 10’);
ECStack.push(
evalContext,
callingContext: globalContext
);
// eval exited context
ECStack.pop();
//foo function call
ECStack.push( functionContext);
//eval(‘ var y = 20’);
ECStack.push(
evalContext,
callingContext: functionContext
);
//return from eval
ECStack.pop();
//return from foo
ECStack.pop();
在1.7以上版本SpiderMonkey的实现中(Firefox,Thunderbird浏览器内置的JS引擎),允许在调用eval函数的时候,将调用上下文作为第二个参数传递给eval函数。因此,如果传入的调用上下文存在的话,就有可能会影响该上下文中原有的私有变量(在该上下文中声明的变量):
function foo(){
var x = 1;
return function() { alert(x); }
};
var bar = foo();
bar(); // 1
eval(‘x = 2’, bar); //传递上下文,影响了内部变量“var x”
bar(); // 2
总结
这些基本理论对于后面执行上下文相关的细节(诸如变量对象、作用域链等等)分析是非常必要的。
扩展阅读
ECMA-363-3标准文档的对应的章节—— 10. 执行上下文
JavaScript内部原理系列-执行上下文(Execution Context)的更多相关文章
- 理解Javascript之执行上下文(Execution Context)
1>什么是执行上下文 Javascript中代码的运行环境分为以下三种: 全局级别的代码 - 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境. 函数级别的代码 - 当执行一 ...
- 深入理解javascript执行上下文(Execution Context)
本文转自:http://blogread.cn/it/article/6178 在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你 ...
- 深入理解Javascript之执行上下文(Execution Context)
在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你就会明白javascript引擎内部在执行代码以前到底做了些什么,为什么某些函数 ...
- JavaScript内部原理系列-变量对象(Variable object)
概要 我们总是会在程序中定义一些函数和变量,之后会使用这些函数和变量来构建我们的系统.然而,对于解释器来说,它又是如何以及从哪里找到这些数据的(函数,变量)?当引用一个对象的时候,在解释器内部又发生了 ...
- JavaScript内部原理实践——真的懂JavaScript吗?(转)
通过翻译了Dmitry A.Soshnikov的关于ECMAScript-262-3 JavaScript内部原理的文章, 从理论角度对JavaScript中部分特性的内部工作机制有了一定的了解. 但 ...
- Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...
- JVM 内部原理系列
JVM 内部原理(一)— 概述 JVM 内部原理(二)— 基本概念之字节码 JVM 内部原理(三)— 基本概念之类文件格式 JVM 内部原理(四)— 基本概念之 JVM 结构 JVM 内部原理(五)— ...
- Javascript 执行上下文 context&scope
执行上下文(Execution context) 执行上下文可以认为是 代码的执行环境. 1 当代码被载入的时候,js解释器 创建一个 全局的执行上下文. 2 当执行函数时,会创建一个 函数的执行上下 ...
- [JavaScript深入系列]JavaScript深入之执行上下文栈(转载)
顺序执行? 如果要问到 JavaScript 代码执行顺序的话,想必写过 JavaScript 的开发者都会有个直观的印象,那就是顺序执行,毕竟: var foo = function () { co ...
随机推荐
- python学习笔记(十三)接口开发
一.开发接口的作用 1.mock接口,模拟一些接口,在别的接口没有开发好的时候,需要开发一些模拟接口进行调试和测试. 2.查看数据,比如,获取所有学员信息的接口,就不需要提供数据库的查看信息. 二.接 ...
- 1130 - Host '' is not allowerd to connect to this MySQL server,
是因为缺少访问权限,在MySQL ->User表里 执行 INSERT INTO `user` VALUES ('%', 'root', '*81F5E21E35407D884A6CD4A731 ...
- hdu6194 string string string
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6194 题目: string string string Time Limit: 2000/10 ...
- HDU - 4871 Shortest-path tree (最短路径树+ 树分治)
题意:给你一张带权无向图,先求出这张图从点1出发的最短路树,再求在树上经过k个节点最长的路径值,以及个数. 分析:首先求最短路树,跑一遍最短路之后dfs一遍即可建出最短路树. 第二个问题,树分治解决. ...
- java 加密解密
https://www.cnblogs.com/kingsleylam/category/752546.html <java加密与解密艺术>代码可抄袭.
- iOS开发之plist文件操作
之前在想用代码去实现很多界面上能用interface builder可以拖进去的功能,现在想想真是够无知的啊.不仅效率低下,而且对于代码的维护带来不少麻烦,这段时间一直在反思看了design+code ...
- DCU项目总结
1.什么是DCU 在某些基站无法覆盖的地方,如大型体育馆内部1楼.2楼..,此时通过DCU为这些地方提供信号 2.DCU组成 3.我们需要做的 PC通过进入UMPT网关,在一个网页中使用自定义指令集控 ...
- 学习记录:交叉编译环境配置(buildroot and gdb&gdbserver)【转】
本文转载自:https://blog.csdn.net/zhy025907/article/details/52332528 1,背景 因为参加公司的路由器逆向培训,首先需要的就是环境的配置准备工作, ...
- [转载]Javassist 使用指南(一)
======================= 本文转载自简书,感谢原作者!. 原链接如下:https://www.jianshu.com/p/43424242846b =============== ...
- ideal开发工具环境设置
ideal现在是很流行的一种java开发工具,不得不说,它真的很好用.当你使用的时候,需要设置环境. 首先,如果产生乱码,解决如下: 设置为UTF-8 如果项目是maven项目,设置如下: 也可以设置 ...