javascript 之实施环境-08

概念

履行环境(Execution
context,简称EC)或实行上下文对象(后面统一用实践上下文表示),它定义了变量或者函数有且访问的旁数据,决定了她们分别的行。是勿是出接触不好理解,先简单翻译下:
js代码执行时所当的条件。继续后面

每当JavaScript中履行环境分三栽:

  1. 全局执行环境 :
    这个是无限外面的实行环境,一旦代码被载入,引擎最先进入的就是是此环境。在浏览器中,全局环境就是window对象,因此有着全局属性和函数都是当做window对象的性能和法创建。全局执行环境直到应用程序退出时才会给灭绝。
     
  2. 函数执行环境:当执行流执行一个函数时,javascript会创建一个新的函数执行环境,函数执行环境遭受的代码执行完以后,该条件销毁,保存于里边的保有变量和函数定义也给之销毁。
  3. Eval(一个平常函数,但是他生一个快速通道通向编译器,可以拿string变成可实施之代码)执行环境
    : Eval的实践环境与函数调用的实践环境一致。

履环境做

当JavaScript代码执行一段子可实施代码时,会创造对应之推行上下文(execution
context)。对于每个执行上下文,都生三独第一性质:

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

美学原理 1

实施进程

  • 开创上下文对象(可以知道吧初始化某些性能)
  • 代码执行(赋值、改变价值相当操作)

连续分别以《执行环境之变量对象》、《执行环境的图域链》、《执行环境之this指针》介绍这三独特性,这里只是简单介绍实行环境,后续会切实介绍实行环境。

实践上下文栈

这就是说现在问题来了,平时工作受到描写的全局变量,函数和嵌套函数应该多了咔嚓,每执行一个函数就见面创一个初的函数执行上下文,想想那么多尽上下文是免是发接触恐怖,那么js又是什么保管那么基本上之履上下文呢?

当执行流执行一个函数时,就会见让当下函数创建行上下文,并且将拖欠实施上下文被推入一个履行上下文栈中(Execution context
stack,ECS)
,在函数执行了后,施行上下文栈将为弹来,并且把控制器返回给前面实施之尽上下文;

留神,一个函数可能会见创造无数的上下文,因为对函数美学原理的每次调用(即使这函数递归的调用自己)都见面生成一个享有新状态的上下文;

依据办事规律执行上下文栈类似一个数组结构 ,我们学执行上下文栈的行为:

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

 JavaScript
开始要分解实施代码的时节,最先遇到的就是是全局代码,所以初始化的早晚首先就是会见于实践上下文栈压入一个大局执行上下文,用
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     // 伪代码
 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
之变量对象》。