原文: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. C# WinForm多线程(一)Thread类库

    Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括 ...

  2. Java正则表达式例子汇总

    1.过滤特殊字符 package com.sheepmu.text; /* * @author sheepmu */ public class HWCompetition { public stati ...

  3. 编译命令行终端 swift

    So, this is where swift lives, after you've installed XCode 6 Beta: /Applications/Xcode6-Beta.app/Co ...

  4. java提高篇(十二)-----equals()

    equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...

  5. Java下拼接执行动态SQL语句(转)

    在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...

  6. mysql 多个字段拼接

    Mysql的查询结果行字段拼接,能够用以下两个函数实现: 1. concat函数 mysql> select concat('1','2','3') from test ; +--------- ...

  7. 开源Math.NET基础数学类库使用(10)C#进行基本数据统计

    原文:[原创]开源Math.NET基础数学类库使用(10)C#进行基本数据统计               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...

  8. hadoop得知;block数据块;mapreduce实现样例;UnsupportedClassVersionError变态;该项目的源代码相关联

    对于开源的东西.特别是刚出来不久.我认为最好的学习方法是能够看到源代码,doc,样品测试 为了方便查看源代码,导入与项目相关的源代码 watermark/2/text/aHR0cDovL2Jsb2cu ...

  9. jxl创Excel档java示例代码说明

    记得下载 并 导入jxl.jar 包,免积分下载地址:http://download.csdn.net/detail/u010011052/7561041 package Test; import j ...

  10. 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面

    于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模 ...