澳门威利斯人_威利斯人娱乐「手机版」

来自 澳门威利斯人 2019-06-29 19:59 的文章
当前位置: 澳门威利斯人 > 澳门威利斯人 > 正文

执行上下文,深入理解JavaScript系列

简介

从本章初叶,笔者将接力(翻译、转发、整理)

本章大家要上课的是ECMAScript规范里的执行上下文和连锁可举行代码的各个类型。

原始作者:Dmitry A. Soshnikov
原始发布: 2009-06-26
俄文原文:http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/

英文翻译:Dmitry A. Soshnikov.
发布时间:2010-03-11
英文翻译:http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/

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

JavaScript:试行上下文(Execution Contexts)

简介
从本章开首,笔者将时有时无(翻译、转发、整理)

定义

历次当调节器转到ECMAScript可进行代码的时候,即会进来到二个推行上下文。实践上下文(简称-EC)是ECMA-262正规里的一个抽象概念,用于同可试行代码(executable code)概念进行区分。

标准标准未有从本领完毕的角度定义EC的规范类型和协会,那应当是实际落到实处ECMAScript引擎时要思考的主题材料。

一抬手一动脚的实行上下文组在逻辑上整合一个储藏室。仓库后面部分永世都以全局上下文(global context),而顶上部分正是这段日子(活动的)推行上下文。仓库在EC类型进入和剥离上下文的时候被更换(推入或弹出)。

简介

 

本章大家要上课的是ECMAScript标准里的试行上下文和连锁可实施代码的各体系型。

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

本章我们要上课的是ECMAScript标准里的实践上下文和血脉相通可施行代码的各体系型。

可施行代码类型

可实行代码的品类那些概念与施行上下文的抽象概念是有提到的。在好曾几何时刻,可实践代码与实行上下文完全有一点都不小概率是等价的。

比方说,大家能够定义执行上下文饭店是贰个数组:

ECStack = [];

老是进入function (尽管function被递归调用或作为构造函数) 的时候依然放到的eval函数职业的时候,那个库房都会被压入。

定义

老是当调控器转到ECMAScript可执行代码的时候,即会进来到一个实践上下文。施行上下文(简称-EC)是ECMA-262行业内部里的八个抽象概念,用于同可推行代码(executable code)概念进行区分。

标准规范没有从本领完毕的角度定义EC的可相信类型和布局,那应当是切实可行落到实处ECMAScript引擎时要考虑的主题素材。

一抬手一动脚的实行上下文组在逻辑上整合多个储藏室。仓库底部永恒都以全局上下文(global context),而最上端便是现阶段(活动的)试行上下文。旅馆在EC类型进入和剥离上下文的时候被涂改(推入或弹出)。

原始我:Dmitry A. Soshnikov
原始公布: 二〇一〇-06-26
俄文原版的书文:

全局代码

那连串型的代码是在"程序"级管理的:举例加载外界的js文件也许本地<script></script>标签内的代码。全局代码不蕴含任何function体内的代码。

在初阶化(程序运营)阶段,ECStack是那样的:

ECStack = [
  globalContext
];

可举办代码类型

可执行代码的门类这几个定义与实施上下文的抽象概念是有涉及的。在某个时刻,可实行代码与实行上下文完全有异常的大大概是等价的。

譬喻,大家得以定义施行上下文仓库是二个数组:

ECStack = [];

老是进入function (纵然function被递归调用或作为构造函数) 的时候依旧放置的eval函数职业的时候,那个库房都会被压入。

英文翻译:Dmitry A. Soshnikov.
发表时间:二零一零-03-11
英文翻译:

函数代码

当进入funtion函数代码(全部类型的funtions)的时候,ECStack被压入新因素。须要留意的是,具体的函数代码不包含内部函数(inner functions)代码。如下所示,大家使函数本身调自个儿的章程递归一次:

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

那正是说,ECStack以如下格局被退换:

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

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

每一趟return的时候,都会退出当前执行上下文的,相应地ECStack就能够弹出,栈指针会自行移动地点,这是三个拔尖的货仓达成格局。三个抛出的特别假诺没被缴获的话也是有相当大只怕从多个或七个施行上下文退出。相关代码实行完以往,ECStack只会包罗全局上下文(global context),一向到全部应用程序结束。

大局代码

那体系型的代码是在程序级处理的:例如加载外界的js文件也许地点<script></script>标签内的代码。全局代码不包括任何function体内的代码。

在伊始化(程序运维)阶段,ECStack是这么的:

ECStack = [
  globalContext
];

正文参谋了天涯论坛justinw的中文翻译,做了一部分错误考订,多谢译者。
复制代码
定义
每一趟当调控器转到ECMAScript可实施代码的时候,即会跻身到三个实施上下文。推行上下文(简称-EC)是ECMA-262正规里的多少个抽象概念,用于同可施行代码(executable code)概念实行区分。

Eval 代码

eval 代码有一点儿意思。它有多个概念: 调用上下文(calling context),比如,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(<foo> functionContext);

// eval('var y = 20');
ECStack.push(
  evalContext,
  callingContext: <foo> 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

函数代码

当进入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),平昔到一切应用程序结束。

标准标准未有从技巧达成的角度定义EC的高精度类型和结构,那应当是切实可行实现ECMAScript引擎时要思索的题目。

结论

那篇文章是末端分析任何跟推行上下文相关的宗旨(举个例子变量对象,成效域链,等等)的最起码的申辩基础,那些大旨就要继续章节中讲到。

Eval 代码

eval 代码有一点儿意思。它有三个定义: 调用上下文(calling context),举个例子,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

运动的实践上下文组在逻辑上结成三个库房。仓库后面部分永久都是全局上下文(global context),而顶上部分正是最近(活动的)试行上下文。货仓在EC类型进入和剥离上下文的时候被涂改(推入或弹出)。

其他参照他事他说加以考察

那篇小说的剧情在ECMA-262-3 标准标准中对应的章节— 10. Execution Contexts.

结论

那篇小说是前面分析任何跟施行上下文相关的宗旨(举例变量对象,效能域链,等等)的最起码的论争功底,那几个大旨就要三番五次章节中讲到。

 

Contexts) 简单介绍本章大家要上课的是ECMAScript规范里的实行上下文和血脉相通可实践代码的各种类型。 本文仿效了...

可进行代码类型
可实行代码的档案的次序这一个概念与实施上下文的抽象概念是有提到的。在好何时刻,可试行代码与实行上下文完全有非常的大希望是等价的。

联机与引入

本文已协同至目录索引:深切领会JavaScript种类

深远明白JavaScript体系作品,包含了原创,翻译,转发等各个型的稿子,假如对你有用,请推荐协理一把,给岳丈写作的引力。


举个例子说,我们能够定义实践上下文旅馆是多少个数组:

ECStack = [];
老是进入function (尽管function被递归调用或作为构造函数) 的时候照旧放到的eval函数职业的时候,那几个库房都会被压入。

全局代码
那连串型的代码是在"程序"级管理的:比如加载外界的js文件大概地面<script></script>标签内的代码。全局代码不包涵任何function体内的代码。

在初阶化(程序运转)阶段,ECStack是这么的:

复制代码 代码如下:

ECStack = [
globalContext
];

函数代码
当进入funtion函数代码(全数品类的funtions)的时候,ECStack被压入新因素。须要留神的是,具体的函数代码不包含内部函数(inner functions)代码。如下所示,大家使函数自身调自身的办法递归一次:

复制代码 代码如下:

本文由澳门威利斯人发布于澳门威利斯人,转载请注明出处:执行上下文,深入理解JavaScript系列

关键词: 澳门威利斯人