执行环境(Execution Context,也称为"执行上下文")是JavaScript中最为重要的一个概念。执行环境定义了变量或函数有权访问的其它数据,决定了各自的行为。当JavaScript代码执行的时候,会进入不同的执行环境,这些不同的执行环境就构成了执行环境栈。

  JavaScript中主要存在三种执行环境:

  • 全局执行环境

   JavaScript代码执行的默认环境。通常被默认为window对象,所有的全局变量和函数都作为window对象的属性和方法存在。当执行环境中的代码执行完毕之后,执行环境被销毁,其中的所有变量和函数也随之销毁。对于全局执行环境来说,当关闭网页或浏览器时,该环境被销毁。

  • 函数执行环境

     当执行一个JavaScript函数时,函数的环境被推入环境栈中,执行完毕之后,栈将执行环境推出,将控制权转交给之前的执行环境。

  • Eval环境

   执行eval()函数时创建。

  对于执行环境栈,请看如下代码:

var a = "global";
function example(){console.log(a);
}function outer(){var b = "outer";console.log(b);   function inner(){var c = "inner";console.log(c);example();}inner();
}outer();

  代码首先进入全局执行环境,然后依次进入outer,inner和example的执行环境,执行环境栈可以表示为:

  

  每个执行环境都有三个重要的属性,变量对象(VO)、作用域链(scope chain)和this。下面首先看一下变量对象。

  变量对象和活动对象(VO和AO)

   变量对象

  每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。当代码在一个环境中执行时,会创建当前变量对象的一个作用域链(scope chain)。作用域链的最前端,始终是当前执行环境的变量对象。如果执行环境是函数,则其活动对象(activation object)作为变量对象。作用域链的下一个变量对象来自于父执行环境,而再下一个变量对象来自于父环境的外部环境,以此类推构成完整的作用域链,而最外层的变量对象始终是全局执行环境的变量对象。

  一般来说,变量对象(VO)中包含以下信息:

  • 变量
  • 函数声明
  • 函数的形参

  当JavaScript代码执行的时候,如果试图寻找一个变量或函数,就会首先寻找VO。对于前面提到的代码,全局执行环境的VO如下所示:

  

  对于VO来说,函数表达式不包含在VO中,没有使用var声明的变量也不包含在VO中,这种方式只是给Global添加了一个属性。

  活动对象

  只有全局执行环境的变量对象允许通过VO的属性名称间接访问。但在函数执行环境中,VO是不允许被直接访问的。此时,由活动对象(Activation Object,简称AO)扮演VO的角色。活动对象在进入函数执行环境时被创建,它通过函数的arguments属性初始化,其中Arguments Objects是函数执行环境中活动对象AO的内部对象。

  VO和AO的关系,简单点说就是,VO在不同的执行环境中有不同的变现形式。在全局执行环境中,可以直接使用VO;但是在函数执行环境中,AO被创建。

  在上面的代码例子中,当开始执行outer函数的时候,outer函数的AO被创建如下图所示:

  

  执行环境的具体过程

  当进入一个执行环境的时候,JavaScript解释器会创建新的执行环境,但具体是怎么做的呢?主要分为两个阶段:

  • 创建阶段

    • 创建作用域链
    • 创建VO/AO
    • 设置this的值
  • 执行阶段
    • 设置变量的值
    • 设置函数的引用
    • 解释执行代码

  对于"创建VO/AO"这一步,JavaScript解释器主要做了下面的事情:

  • 根据函数参数,创建并初始化arguments object
  • 根据函数内部代码查找函数声明
    • 对于找到的所有函数声明,将函数名和引用全部存入VO/AO
    • 如果存在同名函数,进行覆盖
  • 根据函数内部代码查找变量声明
    • 对于找到的所有变量声明,全部存入VO/AO,并初始化为"undefined"
    • 如果变量名称和已经声明的形参或函数相同,那么变量声明不会干扰这类属性

  看下面的例子:

function example(p) {var a = 'hello';var b = function b() {...};function c() {...}
}example(2);

  对于上面的例子,在执行环境创建阶段,会得到如下的执行环境对象:

exampleExecutionContext={scopeChain: {...},VO:{arguments:{0:2,length:1}p:2,c:pointer to function c()   a:undefined,b:undefined},this: {...}
}

  在代码执行阶段,环境对象会被更新,如下所示:

exampleExecutionContext={scopeChain: {...},VO:{arguments:{0:2,length:1}p:2,c:pointer to function c()   a:'hello',b:pointer to function b()},this: {...}
}

转载于:https://www.cnblogs.com/neusc/p/5771150.html

JavaScript执行环境相关推荐

  1. JavaScript执行环境及作用域(一)——执行环境栈和作用域链机制

    2019独角兽企业重金招聘Python工程师标准>>> 执行环境是JavaScript中最为重要的一个概念,每个执行环境都有一个与之关联的变量对象,执行环境中所有的变量和函数都保存在 ...

  2. JavaScript执行环境 + 变量对象 + 作用域链 + 闭包

    闭包真的是一个谈烂掉的内容.说到闭包,自然就涉及到执行环境.变量对象以及作用域链.汤姆大叔翻译的<深入理解JavaScript系列>很好,帮我解决了一直以来似懂非懂的很多问题,包括闭包.下 ...

  3. JavaScript——执行环境、变量对象、作用域链

    前言 这几天在看<javascript高级程序设计>,看到执行环境和作用域链的时候,就有些模糊了.书中还是讲的不够具体.通过上网查资料,特来总结,以备回顾和修正. 目录: EC(执行环境或 ...

  4. javaScript执行环境、作用域链与闭包

    一.执行环境 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ...

  5. JavaScript执行上下文和作用域链

    执行上下文作用域链 执行上下文(Execution Context):函数执行前进行的准备工作(也称执行上下文环境) 运行 JavaScript 代码的时候,当代码执行进入一个环境时,就会为该环境创建 ...

  6. 《javascript高级程序设计》笔记:内存与执行环境

    上一篇:<javascript高级程序设计>笔记:继承 近几篇博客都会围绕着图中的知识点展开 由于javascript是一门具有自动垃圾收集机制的编程语言,开发者不必担心内存的分配和回收的 ...

  7. JavaScript中的执行环境

    JavaScript中的执行环境 注意区分函数的执行环境和函数声明环境 看代码: 转载于:https://www.cnblogs.com/mc67/p/5190179.html

  8. JavaScript语言精粹--执行环境及作用域,this

    1.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 虽然我们无法访问,但是解析器在处理数据时 ...

  9. JavaScript中执行环境和栈

    在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...

最新文章

  1. OpenCV数据结构与基本绘图(Mat 类、Point类、Scalar类等)
  2. 【DOM编程艺术】动态创建标记(签)---创建和插入节点
  3. MATLAB学习笔记(一)——入门与操作
  4. HighNewTech:带你解读云计算、雾计算(Fog Computing)、边缘计算(Edge Computing)的前世今生
  5. CentOS 下安装
  6. Java 算法 打水问题
  7. 中国酸性级萤石粉行业市场供需与战略研究报告
  8. Skywalking微服务监控分析
  9. Linux下SVN 命令操作手册
  10. C#实现四舍五入和JavaScript实现四舍五入
  11. Android开发点滴 - 实现层级式导航(API 16+)
  12. VGG19 基本网络结构图
  13. 毕设系统之网上订餐管理系统
  14. php工厂模式计算器,php设计模式之工厂模式(工厂模式实现计算器功能)
  15. LimeSDR官方系列教程(三):一个实际测试例子
  16. 手写一个简单的mybatis
  17. 基于51单片机的12864液晶演示器驱动
  18. Linux 安装WebLogic9.2 MP2(图文详解 教程下载)
  19. 判断tvs能抗住多少千伏浪涌的依据_TVS管主要参数说明及作用
  20. GoIP/WoIP/CoIP对接VOS

热门文章

  1. [OpenS-CAD]屏幕坐标转换分析
  2. iOS优化内存,提升性能 之五
  3. rhel5 下cacti安装日志
  4. Python 扩展C
  5. L1-080 乘法口诀数列 (20 分)-PAT 团体程序设计天梯赛 GPLT
  6. python保存模型 drop_(长期更新)【python数据建模实战】零零散散问题及解决方案梳理...
  7. request.getInputStream中文乱码解决方案
  8. 五种 JSP页面跳转方法详解
  9. perl 如何判断变量为空
  10. 如何快速将文件中的空格更换成逗号(图文详解)