Execution Contexts (执行上下文)
本章我们一起讨论一下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 (执行上下文)的更多相关文章
- Javascript 执行上下文 context&scope
执行上下文(Execution context) 执行上下文可以认为是 代码的执行环境. 1 当代码被载入的时候,js解释器 创建一个 全局的执行上下文. 2 当执行函数时,会创建一个 函数的执行上下 ...
- 深入理解JavaScript系列(11):执行上下文(Execution Contexts)
简介 从本章开始,我将陆续(翻译.转载.整理)http://dmitrysoshnikov.com/网站关于ECMAScript标标准理解的好文. 本章我们要讲解的是ECMAScript标准里的执行上 ...
- 你不知道的JavaScript--Item19 执行上下文(execution context)
在这篇文章里,我将深入研究JavaScript中最基本的部分--执行上下文(execution context).读完本文后,你应该清楚了解释器做了什么,为什么函数和变量能在声明前使用以及他们的值是如 ...
- 理解Javascript之执行上下文(Execution Context)
1>什么是执行上下文 Javascript中代码的运行环境分为以下三种: 全局级别的代码 - 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境. 函数级别的代码 - 当执行一 ...
- SQL Server安全(6/11):执行上下文与代码签名(Execution Context and Code Signing)
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- 深入理解javascript执行上下文(Execution Context)
本文转自:http://blogread.cn/it/article/6178 在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你 ...
- JavaScript内部原理系列-执行上下文(Execution Context)
概要 本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型. 定义 每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文.执行上下文(简称:EC)是个抽 ...
- 深入理解Javascript之执行上下文(Execution Context)
在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你就会明白javascript引擎内部在执行代码以前到底做了些什么,为什么某些函数 ...
- JavaScript执行上下文
变量声明.函数声明为何会提升?js执行时是如何查找变量的?JavaScript中最基本的部分——执行上下文(execution context) 什么是执行上下文? 当JavaScript代码运行,执 ...
随机推荐
- JNI-Test
//testdll.h/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header fo ...
- c语言技巧--长期更新
1. #define LOWER(c) (unsigned char)(c | 0x20) 换成小写 2. gcc -Wall -Werror //告警当成 错误来处理 ...
- jquery中each遍历对象和数组示例
通用遍历方法,可用于遍历对象和数组.$().each(),回调函数拥有两个参数: 第一个为对象的成员或数组的索引,第二个为对应变量或内容.如需退出each循环可使回调函数返回false 现有如下两个s ...
- jQuery 表格插件25
jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用 ...
- Seven Steps to Success Machine Learning in Practice
Seven Steps to Success Machine Learning in Practice Project failures in IT are all too common. The r ...
- SysErrorMessage 函数和系统错误信息表
在看 API 文档时, 我们经常见到 GetLastError; 它可以返回操作后系统给的提示.但 GetLastError 返回的只是一个信息代码, 如何返回对应的具体信息呢?FormatMessa ...
- Linux启动或禁止SSH用户及IP的登录
启动或禁止SSH用户登录 一般情况下,在使用Linux操作系统都不会去机房来操作机器,都是使用一些第三方的工具来操作. 比如使用SSH Secure File Transfer Client工具来传输 ...
- Linux Shell编程(18)—— 循环控制
影响循环行为的命令break, continuebreak和continue这两个循环控制命令[1]与其它语言的类似命令的行为是相同的. break命令将会跳出循环,continue命令将会跳过本次循 ...
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery 解决方法
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'的意思是,这版本的 MySQL 不支持使 ...
- SRM 408(1-250pt, 1-500pt)
DIV1 250pt 题意:每天晚上需要点蜡烛,且每晚蜡烛燃烧1cm,第i天晚上需要点i根蜡烛.第一天白天的时候,拥有一些蜡烛,用vector<int>can表示他们的长度,问最多能烧几个 ...