javascript 之履环境-08javascript 之行环境-08

概念

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

于JavaScript中执环境分三栽:

  1. 全局执行环境 :
    这个是不过外面之履环境,一旦代码被载入,引擎最先进入的即使是是条件。在浏览器中,全局环境就是是window对象,因此有所全局属性和函数都是当做window对象的性能和法创建。全局执行环境直到应用程序退出时才见面受销毁。
     
  2. 函数执行环境:当尽流执行一个函数时,javascript会创建一个新的函数执行环境,函数执行环境被的代码执行完事后,该环境销毁,保存在中的拥有变量和函数定义为被之销毁。
  3. Eval(一个通常函数,但是他起一个快速通道通向编译器,可以以string变成可实行之代码)执行环境
    : Eval的尽环境及函数调用的行环境一致。

概念

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

在JavaScript中尽环境分三种植:

  1. 全局执行环境 :
    这个是极外面的履行环境,一旦代码被载入,引擎最先进入的哪怕是此条件。在浏览器被,全局环境就是是window对象,因此具有全局属性和函数都是用作window对象的性能和法创建。全局执行环境直到应用程序退出时才见面于销毁。
     
  2. 函数执行环境:当尽流执行一个函数时,javascript会创建一个新的函数执行环境,函数执行环境被之代码执行完之后,该环境销毁,保存在中的兼具变量和函数定义为叫之销毁。
  3. Eval(一个通常函数,但是他起一个快速通道通向编译器,可以拿string变成可实行之代码)执行环境
    : Eval的履行环境暨函数调用的执行环境一致。

施行环境结合

当JavaScript代码执行一截可实施代码时,会创造对应的尽上下文(execution
context)。对于每个执行上下文,都出三只主要性质:

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

图片 1

施行环境结合

当JavaScript代码执行一段落可尽代码时,会创造对应的尽上下文(execution
context)。对于每个执行上下文,都发三个主要性质:

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

图片 2

施行过程

  • 始建上下文对象(可以了解吧初始化某些性能)
  • 代码执行(赋值、改变价值当操作)

继往开来分别于《执行环境的变量对象》、《执行环境之作用域链》、《执行环境之this指针》介绍这三独特性,这里只是简短介绍实行环境,后续会具体介绍实行环境。

行过程

  • 创上下文对象(可以知晓啊初始化某些性能)
  • 代码执行(赋值、改变价值等操作)

接轨分别以《执行环境的变量对象》、《执行环境之作用域链》、《执行环境的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,直到应用程序退出(例如关闭网页)

实行上下文栈

这就是说现在题材来了,平时工作着写的全局变量,函数和嵌套函数应该多多了咔嚓,每执行一个函数就会见创一个新的函数执行上下文,想想那么多尽上下文是匪是有接触恐怖,那么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
之变量对象》。

回忆定义

实践环境(Execution
context,简称EC)或施行上下文对象,它定义了变量或者函数有且访问的其他数,决定了她们各自的行事。

当尽流进来一个函数时,创建行上下文对象,然后推入执行上下文栈。是匪是发跟定义相差太远,难道是《javascript高程程序设计》写错了?

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

相关文章