理解JS的执行环境

作者: bruce_zhou | 来源:发表于2016-05-29 19:09 被阅读3065次

执行环境(Execution context,EC)或执行上下文,是JS中一个极为重要的概念

EC的组成

当JavaScript代码执行的时候,会进入不同的执行上下文,这些执行上下文会构成了一个执行上下文栈(Execution context stack,ECS)。

EC的组成
  • 变量对象(Variable object,VO): 变量对象即包含变量的对象,除了我们无法访问它外,和普通对象没什么区别。
  • [[Scope]]属性:作用域即变量对象,作用域链是一个由变量对象组成的带头结点的单向链表,其主要作用就是用来进行变量查找。而[[Scope]]属性是一个指向这个链表头节点的指针。
  • this: 指向一个环境对象,注意是一个对象,而且是一个普通对象,而不是一个执行环境。

产生EC的两个阶段

当一段JS代码执行的时候,JS解释器会通过两个阶段去产生一个EC

  1. 创建阶段(当函数被调用,但是开始执行函数内部代码之前)
  2. 创建变量对象VO
  3. 设置[[Scope]]属性的值
  4. 设置this的值
  5. 激活/代码执行阶段
    初始化变量对象,即设置变量的值、函数的引用,然后解释/执行代码。

创建变量对象VO

  1. 根据函数的参数,创建并初始化arguments object
  2. 扫描函数内部代码,查找函数声明(function declaration)
  • 对于所有找到的函数声明,将函数名和函数引用存入VO中
  • 如果VO中已经有同名函数,那么就进行覆盖
//函数声明
function f(){}
  1. 扫描函数内部代码,查找变量声明(Variable declaration)
  • 对于所有找到的变量声明,将变量名存入VO中,并初始化为undefined
  • 如果变量名跟已经声明的形参或函数相同,则什么也不做
//变量声明,必须通过var关键字声明
var example = 'example'

注:步骤2和3也称为声明提升(declaration hoisting)

执行环境的分类

  • 全局执行环境
    在浏览器中,其指window对象,是JS代码开始运行时的默认环境。
    全局执行环境的变量对象始终都是作用域链中的最后一个对象。
  • 函数执行环境
    当某个函数被调用时,会先创建一个执行环境及相应的作用域链。然后使用arguments和其他命名参数的值来初始化执行环境的变量对象。

注:上面的分类也说明了JS中只有两种作用域(作用域即变量对象):全局作用域、函数作用域,并没有块级作用域,更没有对象作用域(见最后的例子,但是with语句是一个例外,其可以临时在作用域链的前端增加一个普通对象)

this

见文章:JS中的this

参考资料

JavaScript的执行上下文, 五星级好文
JavaScript中的this
理解JavaScript中的作用域链
Scope chain
JavaScript高级程序设计

相关文章

  • 理解JS的执行环境

    执行环境(Execution context,EC)或执行上下文,是JS中一个极为重要的概念 EC的组成 当Jav...

  • 1-1 JavaScript执行环境 执行栈

    1.1执行环境 执行环境可以简称为环境,可以理解为JS被解析和执行所在的外部环境。 1.1.1全局执行环境 全局执...

  • js引擎的执行机制

    js引擎的执行机制 JS的Event Loop是JS的执行机制,理解JS的执行,必须理解Event Loop JS...

  • JavaScript调用栈理解

    要理解js的调用栈,首先要 理解执行上下文。1.执行上下文的概念:是当前js代码被解析和执行所在环境的抽象概念2....

  • 闭包和this

    执行上下文 执行上下文是什么 可以简单理解执行上下文是js代码执行的环境,当js执行一段可执行代码时,会创建对应的...

  • js 随笔

    js 执行机制: js执行上下文: 只有理解了js 执行上下文才能更好的理解 js变量提升以及 作用域和闭包 所谓...

  • swift和javaScriptCore交互

    JSContext:JSContext是JS的执行环境,通过evaluateScript()方法可以执行JS代码 ...

  • js闭包、执行环境、作用域链

    执行环境 执行环境:函数的运行环境 js的全局执行环境:window对象=》活动对象 1、每个函数都有一个执行环境...

  • js 执行环境

    Javascript是解释性语言,执行的时候动态解析编译。在端运行的时候,这里以浏览器为讨论环境。 浏览器主要分为...

  • JS执行环境

    JS脚本可在 浏览器和NodeJS中运行 浏览器 新建html文件 ...

网友评论

    本文标题:理解JS的执行环境

    本文链接:https://www.haomeiwen.com/subject/jgeqdttx.html