javascript 之推行环境-08

概念

实践环境(Execution
context,简称EC)或施行上下文对象(后边统一用实践上下文表示),它定义了变量或然函数有权访问的其余数据,决定了她们分其余行事。是不是有点糟糕精晓,先简单翻译下:
js代码执行时所在的环境。继续前边

在JavaScript中实践环境分二种:

  1. 全局执行环境 :
    这些是最外侧的实施环境,一旦代码被载入,引擎开首进入的就是那一个条件。在浏览器中,全局环境就是window对象,因而具有全局属性和函数都是当做window对象的质量和办法创造。全局执行环境直到应用程序退出时才会被灭绝。
     
  2. 函数执行环境:当执行流执行一个函数时,javascript会创制三个新的函数执行环境,函数执行环境中的代码执行完事后,该条件销毁,保存在中间的具备变量和函数定义也被之销毁。
  3. Eval(贰个习以为常函数,不过她有三个快捷通道通向编译器,可以将string变成可实施的代码)执行环境
    : 伊娃l的履行环境和函数调用的执行环境一致。

实践环境结合

当JavaScript代码执行一段可举办代码时,会成立对应的施行上下文(execution
context)。对于每一种执行上下文,都有八个重点性质:

  • 变量对象(Variable object,VO)
  • 意义域链(Scope chain)
  • this

图片 1

施行进度

  • 始建上下文对象(能够驾驭为初叶化某个质量)
  • 代码执行(赋值、改变值等操作)

接轨分别在《执行环境之变量对象》、《执行环境之成效域链》、《执行环境之this指针》介绍那多少个属性,那里只是简短介绍举办环境,后续会实际介绍举行环境。

举办上下文栈

那么未来题材来了,常常干活中写的全局变量,函数以及嵌套函数应该多多了吧,每执行三个函数就会创制四个新的函数执行上下文,想想那么多执行上下文是否有点恐怖,那么js又是什么管理那么多的实践上下文呢?

当执行流执行三个函数时,就会给当下函数创造执行上下文,并且将该执行上下文被推入1个举行上下文栈中(Execution context
stack,ECS)
,在函数执行完事后,施行上下文栈将被弹出,并且把控制器重返给后面实施的推行上下文;

只顾,一个函数或者会成立无数的上下文,因为对函数的每一遍调用(尽管这些函数递归的调用本人)都会转移三个有所新情景的上下文;

依照办事规律执行上下文栈类似叁个数组结构 ,大家模拟执行上下文栈的表现:

1 ECStack = [];  //先定义执行上下文栈是一个数组:

 JavaScript
初步要解释施行代码的时候,发轫遭受的就是大局代码,所以初步化的时候首先就会向实施上下文栈压入2个大局执行上下文,用
globalEC表示它,并且唯有当全体应用程序停止的时候,ECStack
才会被清空,所以 ECStack 最底部永远有个 globalEC:

1 ECStack = [
2     globalEC
3 ];

当今 JavaScript 蒙受下边的那段代码了:

 1 <script>
 2     function run3() {
 3         console.log('run3')
 4     }
 5 
 6     function run2() {
 7         run3();
 8     }
 9 
10     function run1() {
11         run2();
12     }
13     run1();
14 </script>

当执行三个函数的时候,就会成立1个实践上下文,并且压入执行上下文栈,当函数执行完成的时候,就会将函数的实践上下文从栈中弹出。知道了如此的办事原理,让大家来看看如何处理方面那段代码:

 1     // 伪代码
 2 
 3     // run1() 推入执行上下文栈
 4     ECStack.push(run1.EC);
 5 
 6     // run1中调用了run2,创建run2的执行上下文 推入执行上下文栈
 7     ECStack.push(run2.EC);
 8 
 9     // run2还调用了run3,创建run3的执行上下文 推入执行上下文栈
10     ECStack.push(run3.EC);
11 
12     // run3执行完毕
13     ECStack.pop();
14 
15     // run2执行完毕
16     ECStack.pop();
17 
18     // run1执行完毕
19     ECStack.pop();
20 
21     // javascript接着执行下面的代码,但是ECStack底层永远有个globalContext,直到应用程序退出(例如关闭网页)

追忆定义

举行环境(Execution
context,简称EC)或施行上下文对象,它定义了变量只怕函数有权访问的其余数据,决定了她们各自的作为。

当执行流进去多少个函数时,创设执行上下文对象,然后推入执行上下文栈。是还是不是深感跟定义相差太远,难道是《javascript高程程序设计》写错了?

当然不是,执行上下文到底包括了何等内容所以欢迎阅读下一篇《javascript
之变量对象》。