javascript 之执行环境-08
概念
执行环境(Execution context,简称EC)或执行上下文对象(后面统一用执行上下文表示),它定义了变量或者函数有权访问的其他数据,决定了他们各自的行为。是不是有点不好理解,先简单翻译下: js代码执行时所在的环境。继续后面
在JavaScript中执行环境分三种:
- 全局执行环境 : 这个是最外围的执行环境,一旦代码被载入,引擎最先进入的就是这个环境。在浏览器中,全局环境就是window对象,因此所有全局属性和函数都是作为window对象的属性和方法创建。全局执行环境直到应用程序退出时才会被销毁。
- 函数执行环境:当执行流执行一个函数时,javascript会创建一个新的函数执行环境,函数执行环境中的代码执行完之后,该环境销毁,保存在其中的所有变量和函数定义也被之销毁。
- Eval(一个普通函数,但是他有一个快速通道通向编译器,可以将string变成可执行的代码)执行环境 : Eval的执行环境和函数调用的执行环境相同。
执行环境组成
当JavaScript代码执行一段可执行代码时,会创建对应的执行上下文(execution context)。对于每个执行上下文,都有三个重要属性:
- 变量对象(Variable object,VO)
- 作用域链(Scope chain)
- this

执行过程
- 创建上下文对象(可以理解为初始化某些属性)
- 代码执行(赋值、改变值等操作)
后续分别在《执行环境之变量对象》、《执行环境之作用域链》、《执行环境之this指针》介绍这三个属性,这里只是简单介绍执行环境,后续会具体介绍执行环境。
执行上下文栈
那么现在问题来了,平时工作中写的全局变量,函数以及嵌套函数应该不少了吧,每执行一个函数就会创建一个新的函数执行上下文,想想那么多执行上下文是不是有点恐怖,那么js又是如何管理那么多的执行上下文呢?
当执行流执行一个函数时,就会给当前函数创建执行上下文,并且将该执行上下文被推入一个执行上下文栈中(Execution context stack,ECS),在函数执行完之后,执行上下文栈将被弹出,并且把控制器返回给之前执行的执行上下文;
注意,一个函数可能会创建无数的上下文,因为对函数的每次调用(即使这个函数递归的调用自己)都会生成一个具有新状态的上下文;
根据工作原理执行上下文栈类似一个数组结构 ,我们模拟执行上下文栈的行为:
ECStack = []; //先定义执行上下文栈是一个数组:
JavaScript 开始要解释执行代码的时候,最先遇到的就是全局代码,所以初始化的时候首先就会向执行上下文栈压入一个全局执行上下文,用 globalEC表示它,并且只有当整个应用程序结束的时候,ECStack 才会被清空,所以 ECStack 最底部永远有个 globalEC:
ECStack = [
globalEC
];
现在 JavaScript 遇到下面的这段代码了:
<script>
function run3() {
console.log('run3')
} function run2() {
run3();
} function run1() {
run2();
}
run1();
</script>
当执行一个函数的时候,就会创建一个执行上下文,并且压入执行上下文栈,当函数执行完毕的时候,就会将函数的执行上下文从栈中弹出。知道了这样的工作原理,让我们来看看如何处理上面这段代码:
// 伪代码
// run1() 推入执行上下文栈
ECStack.push(run1.EC);
// run1中调用了run2,创建run2的执行上下文 推入执行上下文栈
ECStack.push(run2.EC);
// run2还调用了run3,创建run3的执行上下文 推入执行上下文栈
ECStack.push(run3.EC);
// run3执行完毕
ECStack.pop();
// run2执行完毕
ECStack.pop();
// run1执行完毕
ECStack.pop();
// javascript接着执行下面的代码,但是ECStack底层永远有个globalContext,直到应用程序退出(例如关闭网页)
回顾定义
执行环境(Execution context,简称EC)或执行上下文对象,它定义了变量或者函数有权访问的其他数据,决定了他们各自的行为。
当执行流进入一个函数时,创建执行上下文对象,然后推入执行上下文栈。是不是感觉跟定义相差太远,难道是《javascript高程程序设计》写错了?
当然不是,执行上下文到底包含了哪些内容所以欢迎阅读下一篇《javascript 之变量对象》。
javascript 之执行环境-08的更多相关文章
- 深入理解javascript中执行环境(作用域)与作用域链
深入理解javascript中执行环境(作用域)与作用域链 相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行 ...
- 从头开始学JavaScript (九)——执行环境和作用域
原文:从头开始学JavaScript (九)--执行环境和作用域 一.执行环境:定义了变量或者函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有与之关联的变量对象. 变量对象:保存着环境中 ...
- Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...
- Javascript手记-执行环境和作用域
执行环境是javascript一个重要的概念,执行环境定义了变量有权访问其他数据决定了他们各自的行为,每个执行环境 都有一个与之关联的变量,环境中定义的所有变量和函数都保存在这个对象中,虽然我们编写的 ...
- JavaScript中执行环境和栈
在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...
- JavaScript之执行环境及作用域
执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.我们编写的代码是无法访问这个对象的,但解 ...
- javascript中执行环境和作用域(js高程)
执行环境(execution context,为简单起见,有时也成为“环境”)是javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境 ...
- 转载: JavaScript中执行环境和栈
在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...
- Javascript高级程序设计——执行环境与作用域
Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...
随机推荐
- JSR303的数据校验-Hibernate Validator方式实现
1.什么是JSR303? JSR303是java为bean数据合法性校验所提供的一个标准规范,叫做Bean Validation. Bean Validation是一个运行时的数据校验框架,在验证之后 ...
- APPScan安装与使用教程
一.安装 1.右键安装文件,以管理员身份运行,如下图所示: 2.点击[确定] 3.点击[安装] 4.选择:我接受许可协议中单位全部条款,点击[下一步] 5.点击[安装]到该目录 6.如果需求扫描Web ...
- 再探Spring IOC
这次做了提纲 下面再来一个case study case描述: 这是工具类 //bean的配置信息略去 class MyUtil{ private static UserDao userDao; p ...
- Count(*), Count(1) 和Count(字段)的区别
1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和count(*)的 ...
- JSP获取input(含正则表达式)
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> < ...
- Optional乱用Empty之No value present
前言 看到好多文章都是推荐采用Optinal的,而经常我遇到问题的时候就想:如果设计成optional的话就不会忽略这种NullPointException错误了.然而,optional并不是想用就随 ...
- 浪潮之巅——IT产业的三大定律
说实话除了小说以外,从来没有什么书能让我一口气看完,更不用说IT界的书了.但是吴军老师的<浪潮之巅>这本书除外,电子版的洋洋洒洒五百多页,我一下午就将其看完了.全书通过介绍AT&T ...
- Java历程-初学篇 Day07 循环结构2 for循环
一,格式 for(赋值语句//为循环变量赋初值;条件语句//循环结构的循环条件;赋值语句//迭代,修改循环变量的值){ //循环体; } 二,简单举例 for(int i=1;i<=10;i++ ...
- Crossin-8-1;8-2课程记录
打开文件: open,注意打开文件的路径 读取结束需使用close读取文件: read readlines readline for in 重置光标位置: se ...
- 平稳切换nginx版本
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...