JavaScript:执行上下文(Execution Contexts)

JavaScript:实行上下文(Execution Contexts)

简介

 

本章大家要上课的是ECMAScript标准里的实行上下文和血脉相同可执行代码的各系列型。

本文参考了博客园justinw的中文翻译,做了一些错误修正,感谢译者。

定义

老是当调控器转到ECMAScript可进行代码的时候,即会步入到一个举行上下文。试行上下文(简单称谓-EC卡塔尔是ECMA-262标准里的三个抽象概念,用于同可进行代码(executable
code卡塔尔(قطر‎概念举办区分。

标准规范未有从技能完成的角度定义EC的高精度类型和构造,这应该是生气勃勃达成ECMAScript引擎时要思索的主题材料。

活动的推行上下文组在逻辑上组成三个储藏室。仓库尾巴部分恒久都以全局上下文(global
context卡塔尔(قطر‎,而最上部正是当下(活动的卡塔尔实施上下文。货仓在EC类型步向和分离上下文的时候被改正(推入或弹出)。

可施行代码类型

可举办代码的花色那几个概念与实行上下文的抽象概念是有关联的。在好何时刻,可举行代码与实践上下文完全有希望是等价的。

JavaScript:执行上下文(Execution Contexts)。比方,大家得以定义实行上下文仓库是四个数组:

ECStack = [];

老是进入function (纵然function被递归调用或当作布局函数卡塔尔国的时候依然放到的eval函数工作的时候,那个库房都会被压入。

全局代码

这类别型的代码是在程序级管理的:举个例子加载外界的js文件恐怕本地<script></script>标签内的代码。全局代码不包含任何function体内的代码。

在开首化(程序运行)阶段,ECStack是那般的:

ECStack = [
  globalContext
];

函数代码

当步入funtion函数代码(全部类型的funtions卡塔尔的时候,ECStack被压入新因素。供给专心的是,具体的函数代码不包蕴内部函数(inner
functions卡塔尔国代码。如下所示,大家使函数自身调自个儿的议程递归三次:

(function  foo(bar) {
  if (bar) {
    return;
  }
  foo(true);
})();

那么,ECStack以如下形式被改正:

// 第一次foo的激活调用
ECStack = [
   functionContext
  globalContext
];

// foo的递归激活调用
ECStack = [
   functionContext – recursively
   functionContext
  globalContext
];

历次return的时候,都会退出当前试行上下文的,相应地ECStack就能够弹出,栈指针会自动移动地点,那是二个超人的库房落成格局。二个抛出的百般即使没被缴械的话也会有非常的大概率从叁个或多少个实行上下文退出。相关代码推行完之后,ECStack只会含有全局上下文(global
context卡塔尔(قطر‎,一贯到总体应用程序截至。

Eval 代码

eval 代码有一些儿意思。它有二个概念: 调用上下文(calling
contextState of Qatar,比方,eval函数调用的时候发生的上下文。eval(变量或函数评释卡塔尔国活动会默转潜移调用上下文(calling
context卡塔尔国。

eval('var x = 10');

(function foo() {
  eval('var y = 20');
})();

alert(x); // 10
alert(y); // y 提示没有声明

ECStack的成形历程:

ECStack = [
  globalContext
];

// eval('var x = 10');
ECStack.push(
  evalContext,
  callingContext: globalContext
);

// eval exited context
ECStack.pop();

// foo funciton 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卡塔尔(قطر‎的兑现中,能够把调用上下文作为第三个参数字传送递给eval。那么,假若这么些上下文存在,就有一点都不小希望影响“私有”(有人心仪那样叫它卡塔尔国变量。

function foo() {
  var x = 1;
  return function () { alert(x); };
};

var bar = foo();

bar(); // 1

eval('x = 2', bar); // 传入上下文,影响了内部的var x 变量

bar(); // 2

结论

那篇随笔是后边深入分析任何跟实施上下文相关的宗旨(比方变量对象,成效域链,等等卡塔尔的最起码的说理根底,那一个大旨将要持续章节中讲到。

 

Contexts) 简介本章大家要上课的是ECMAScript标准里的推行上下文和有关可施行代码的各样类型。
本文参考了…

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章