执行上下文(Execution Context)

转载 2018年04月15日 18:30:50

说明


此文译自Dmitry A.Soshnikov 的文章Execution Context

概要


本文将向大家介绍ECMAScript的执行上下文以及相关的ࡤ#21487;执行代码类型。

定义


每当控制器到达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

总结


这些基本理论对于后面执行上下文相关的细节(诸如变量对象、作用域链等等)分析是非常必要的。


关于独占端口

关于独占端口作者:Star2000.6.12欢迎转载,请注明出处.-------------------------------------------------------------------...
  • ghj1976
  • ghj1976
  • 2000-08-24 17:44:00
  • 1627

svn执行上下文错误:由于目标计算机积极拒绝,无法连接

错误提示: svn上传的时候报错:        svn执行上下文错误:由于目标计算机积极拒绝,无法连接 解决办法: 开启svn服务VisualSVN Server ...
  • xb12369
  • xb12369
  • 2014-12-02 15:41:06
  • 37738

js中的作用域和执行上下文的区别

之前一直把作用域和执行上下文的概念弄混淆了,还以为是一个概念,直到自己封装代码用到this时才恍然大悟。var a=1; //全局作用域 function fn1(){ var a=...
  • shengandshu
  • shengandshu
  • 2017-02-21 12:32:12
  • 3103

svn执行上下文错误:由于目标计算机积极拒绝,无法连接 .

错误提示: svn上传的时候报错:        svn执行上下文错误:由于目标计算机积极拒绝,无法连接 解决办法: 开启svn服务VisualSVN Server ...
  • u010865136
  • u010865136
  • 2015-11-06 12:54:28
  • 3361

透过一道面试题来探探JavaScript中执行上下文和变量对象的底

在做面试题之前,我们先搞清楚两个概念 1. 执行上下文(execution context) 2. 变量对象(variable object) 执行上下文 我们都知道JavaScript的...
  • wyangonly
  • wyangonly
  • 2018-01-19 15:07:02
  • 48

svn执行上下文错误 the proxy server returned an error

问题:在使用svn的过程中不小心改动了svn的config文件,导致连不上svn服务器,都会提示: svn执行上下文错误 the proxy server returned an error  解决办...
  • mac_lim
  • mac_lim
  • 2014-01-17 14:16:10
  • 6758

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

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

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

概要 本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型。 定义 每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文。 执行上下文(简称:E...
  • dingyuduan
  • dingyuduan
  • 2015-01-07 18:21:34
  • 300

深入理解javascript(一)-- 之执行上下文(execution context)

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

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

在这篇文章里,我将深入研究JavaScript中最基本的部分——执行上下文(execution context)。读完本文后,你应该清楚了解解释器做了什么,为什么函数和变量能在声明前使用以及他们的值是...
  • i10630226
  • i10630226
  • 2015-10-23 11:16:26
  • 7235
收藏助手
不良信息举报
您举报文章:执行上下文(Execution Context)
举报原因:
原因补充:

(最多只允许输入30个字)