原文:javascript系列之执行上下文

写在前面:一 直想系统的总结一下学过的javascript知识,喜欢这门语言也热爱这门语言。未来想从事前端方面的工作,提前把自己的知识梳理一下。前面写了些 DOM的知识,略觉水平有限。没几个月就要开赴找工作的前线,奈何自己还是个菜鸟,具体写的时候还没有一个完整的思路。多番考虑之后,决定还是翻译外国的 经典系列文章,总结提升的同时,英语水平也可以上一个台阶,双管齐下,相信对以后肯定有好处。当然这个系列的文章已经有好多人翻译过了,水平都挺高(我翻 译过之后参考了一些语句,在此感谢前辈)。要是你觉得我的很烂,还望轻拍砖。实在看不下去的,请绕行,重了会伤害我幼小的心灵的哦。

在此贴上本系列的英文地址:http://dmitrysoshnikov.com/tag/ecma-262-3/

引言

本文将会谈到ECMAScript的执行上下文(译者注:或者执行环境)和与此相关的各类型的可执行代码

每当控制器跳转到ECMAScript的执行代码中时,控制器也就进入了一个执行上下文。

执行上下文(EC):ECMA-262用来定义一段可执行代码的典型性和差异性的抽象概念。

标准文档没有从技术实现的角度准确定义EC的结构和类型。这应该是ECMAScript引擎在具体实现时考虑的问题。

逻辑上,一个动态执行上下文的集合形成了一个堆栈,栈的底部一般是全局执行上下文,顶部--当前(活动)执行上下文。通过压入(push)和推出(pop)各种执行上下文来修改这个栈.

可执行代码

可执行代码是一个与执行上下文这个抽象概念相联系的概念,在谈到可执行代码的同时,可能也就意味着一个执行上下文。

例如,我们定义一个执行上下文堆栈为一个数组 ECStack=[] 每当进入一个函数(即使是递归调用的函数或者是构造函数),这个堆栈就压入一个新的执行上下文,嵌入的eval函数也是一样的。

全局代码

这种代码在“程序层面”中执行:例如外部加载的js文件或者是本地内联代码(在<script></script>标签里)。全局代码不包含存在于函数体内的任何代码。初始化时(程序开始),ECStack如下:

1 ECStack=[globalContext];
函数代码段

当进入函数体(所有的函数),ECStack堆栈中压入了新的元素。必须要注意的是具体函数代码不包含它的内部函数代码段。例如,我们调用一个递归调用自身的函数:

 (function foo(flag){
if(flag){
return;
}
foo(true);
})(false)

然后,ECStack堆栈修正如下:

 //首先执行外部foo函数时
ECStack=[
<foo>functionContext
globalContext]
//递归执行内部foo函数时
ECStack=[
<foo>functionContext-递归foo
<foo>functionContext
globalContext]

当存在于当前执行上下文的函数返回时,ECStack弹出相应的执行上下文,这样连续的自上而下的执行,栈指针也不断移动,这是一个典型的堆栈实现方式。当相关段代码执行完以后,ECStack只包括全局上下文(global context),直到整个应用程序结束。一个被抛出但是没有被截获的异常,同样存在一个或多个执行上下文。

eval代码

(译者注:大量资深学者提出尽量不使用eval,而且此部分价值不大。减少阅读量,故不翻译)

这一小部分理论在未来进一步分析与执行上下文相关的一些细节问题,比如变量对象,作用域链时是很需要的。这些理论将在相关章节中提到。

javascript系列之执行上下文的更多相关文章

  1. JavaScript学习系列之执行上下文与变量对象篇

    一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 正文 在上一篇文章中讲解了JavaScript内存模型,其中有提到执行上下文与变量对象的概念.对于JavaScript开发者来说,理解执行上下文与变 ...

  2. [JavaScript深入系列]JavaScript深入之执行上下文栈(转载)

    顺序执行? 如果要问到 JavaScript 代码执行顺序的话,想必写过 JavaScript 的开发者都会有个直观的印象,那就是顺序执行,毕竟: var foo = function () { co ...

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

    概要 本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型. 定义 每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文.执行上下文(简称:EC)是个抽 ...

  4. JavaScript深入之执行上下文栈

    如果要问到 javascript 代码执行顺序的话,想必写过javascript的开发者都会有个直观的印象,那就是顺序执行,例如: var foo = function(){ console.log( ...

  5. 【进阶1-2期】JavaScript深入之执行上下文栈和变量对象(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/hZIpnkKqdQgQnK1BcrH6Nw 阅读笔记 JS是单线程的语言,执行顺序肯定是顺 ...

  6. JS进阶系列之执行上下文

    function test(){ console.log(a);//undefined; var a = 1; } test(); 也许你会遇到过上面这样的面试题,你只知道它考的是变量提升,但是具体的 ...

  7. JavaScript的执行上下文

    在JavaScript的运行过程中,经常会遇到一些"奇怪"的行为,不理解为什么JavaScript会这么工作. 这时候可能就需要了解一下JavaScript执行过程中的相关内容了. ...

  8. Js 作用域与作用域链与执行上下文不得不说的故事 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

    最近在研究Js,发现自己对作用域,作用域链,活动对象这几个概念,理解得不是很清楚,所以拜读了@田小计划大神的博客与其他文章,受益匪浅,写这篇随笔算是自己的读书笔记吧~. 作用域 首先明确一个概念,js ...

  9. 通俗易懂的来讲讲js的函数执行上下文

    0.开场白 在平时编写JavaScript代码时,我们并不会和执行上下文直接接触,但是想要彻底搞懂JavaScript函数的话,执行上下文是我们绕不过去的一个知识点. 1.执行上下文栈 JavaScr ...

随机推荐

  1. Java线程Dump分析工具--jstack(转)

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...

  2. Duanxx的STM32学习: 启动模式,BOOT0和BOOT1具体解释

    在画STM32的电路图的时候,关于STM32的启动方式纠结了一下,现有的參考设计都是在STM32的启动选择引脚BOOT0和BOOT1上使用了跳帽,用以人工选择STM32的启动方式,可是在实际应用中这样 ...

  3. sql系列(基础)-第二章 限制和排序数据

    更好的看↑代码点击VIEW PLAN 第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时.条件包括 ...

  4. Facebook新框架React Native,一套搞定App开发[转]

    Facebook新框架React Native,一套搞定App开发 本文来自微信公众号“给产品经理讲技术”(pm_teacher),欢迎关注. 做为一名产品经理,你是否遇到过这样的窘境,“帮我把字体调 ...

  5. Unity3D方法来隐藏和显示对象

    Unity3D作 在使用unity3d开发游戏的过程中.我们经常会遇到须要隐藏或者显示的操作,针对这一点,以下做了一些总结. 一.设置Renderer状态 在游戏的开发中,全部可以被渲染的物体都包括有 ...

  6. Fuel 5.1安装openstack I版本号环境

    声明:本博客欢迎转载,但请保留原作者信息! 作者:傅斌杰 团队:华为杭州OpenStack团队 Fuel 简单介绍 Fuel是Mirantis公司开发的部署openstack集群工具,主要功能为裸机P ...

  7. Android - 支持不同的设备

    世界上有各种不一样形状和大小的Android设备.由于有各种不同类型的设备,你的app可能在各种设备上运行.为了在Android上尽可能的成功,你的app需要使配各种不同的设备.最重要的几点需要考虑的 ...

  8. 非对称加密算法RSA使用注意事项

    原文:非对称加密算法RSA使用注意事项 第一个问题,也是最重要的一个——RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteg ...

  9. 旧Mj下拉刷新 An instance 0xca90200 of class UITableView was deallocated while key value observers were s

    An instance 0xca90200 of class UITableView was deallocated while key value observers were still regi ...

  10. 【java基础】==与equals()方法比较

    1.八种基本类型 只有"=="方法进行判断是否相等,比较的是基本数据类型的值,没有equals()方法 2.Java类库中的类 "=="比较的是对象的句柄,即内 ...