一、 执行上下文
1、理解执行上下文
广义上来说:
执行上下文一套非常严格的规则
狭义上来说:
执行上下文一个c++对象
2、 定义:执行上下文以一套非常严格的规则,规范变量存储、提升、this指向。
3、分类: 全局执行上下文;函数执行上下文
3、作用:对数据进行预处理
4、如何计算执行上下文环境的个数?
- n+1
- n:函数调用的次数,函数每调用一次,开启一个对全局数
- 1:全局上下文环境
<!--
执行上下文(也称执行上下文环境)
定义:执行上下文以一套非常严格的规则,用来规范
函数体代码执行前,变量声明并赋值(默认为underfined)
函数声明,函数和变量提升,this赋值等操作。
分类: 全局执行上下文;函数执行上下文
什么时候创建执行上下文环境?
全局执行上下文:全局执行上下文环境是在全局作用域确定之后, js代码马上执行之前创建
函数执行上下文:函数调用时;
如何计算执行上下文环境的个数?
n+1
n:函数调用的次数,函数每调用一次,执行上下文环境。
1:执行上下文环境
注意:执行上下文是附属于自己对应的作用域的
一个作用域在一个时刻可以拥有多个执行上下文,当处于活动状态的只有一个
-->
<script type="text/javascript">
function wrap(){
console.log("函数执行上下文环境")
}
wrap();
wrap();
wrap();
wrap();
wrap();
//6个执行上下文环境
console.log("全局执行上下文环境")
</script>
二、 执行上下文栈
1、 理解压栈
- 当全局代码开始执行前,先创建全局执行上下文环境
- 当全局执行上下文环境创建好了以后将上下文中的所有内容放入栈内存
- 最先放入的在最下边(global)
- 其他执行的函数的执行上下文依次放入(放入的顺序是代码的执行顺序)
- 栈中最后放入的执行完最先出栈。
2、 执行上下文栈是执行上下文的活动记录。
<!--
执行上下文栈
定义: 执行上下文栈是执行上下文的活动记录(数据的出栈&压栈)。
1. 在全局代码执行前, JS引擎就会创建一个栈来存储管理所有的执行上下文对象
2. 在全局执行上下文确定后, 将其添加到栈中(压栈)
3. 在函数执行上下文创建后, 将其添加到栈中(压栈)
4. 在当前函数执行完后,将栈顶的对象移除(出栈)
5. 当所有的代码执行完后, 栈中只剩下在全局执行上下文
一个作用域在一个时刻可以拥有多个执行上下文,当处于活动状态的只有一个
-->
<script type="text/javascript">
function wrap() {
console.log("函数执行上下文环境")
}
// wrapp执行时同时可有5个上下文环境,但处于活动状态的只有一个.
(function wrapp() {
var b = 2;
function inner() {
var c = 3;
三、作用域和执行上下文
区别1:
1. 除全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。而不是在函数调用时。
2. 全局执行上下文环境是在全局作用域确定之后, js代码马上执行之前创建。
3. 函数执行上下文环境是在调用函数时, 函数体代码执行之前创建。
总结:作用域是在代码编译时确定的, 全局执行上下文环境在代码执行前确定, 函数执行上下文环境在函数体代码执行前创建。
区别2:
1. 作用域是静态的, 只要函数定义好了就一直存在, 且不会再变化
2. 上下文环境是动态的, 调用函数时创建, 函数调用结束时上下文环境就会被释放
总结:
作用域是静态的,上下文环境是动态的。
执行上下文是附属于自己对应的作用域的。
区别3:
一个作用域 在一个时刻可以有多个上下文,处于活动状态的上下文只有一个。
联系
1. 上下文环境(对象)是从属于所在的作用域
2. 全局上下文环境==>全局作用域
3. 函数上下文环境==>对应的函数使用域
<!--
作用域&执行上下文的区别与联系:
区别:
1、什么时间确定?
作用域:
全局作用域&局部作用域都是在代码编写时确定的。
执行上下文环境:
全局执行上下文环境是在全局作用域确定之后, js代码马上执行之前创建
函数执行上下文环境是在调用函数时, 函数体代码执行之前创建
2、状态
作用域是静态的, 只要函数定义好了就一直存在, 且不会再变化
上下文环境是动态的, 调用函数时创建, 函数调用结束时上下文环境就会被释放
联系:
1. 上下文环境(对象)是从属于所在的作用域
2. 全局上下文环境==>全局作用域
3. 函数上下文环境==>对应的函数作用域
-->
<script type="text/javascript">
</script>
四、规则
1、全局执行上下文
在执行全局代码前将window确定为全局执行上下文
对全局数据进行预处理:
- 1.var定义的全局变量==>undefined, 添加为window的属性
- 2.function声明的全局函数==>赋值(fun), 添加为window的方法
- 3.提升
- 4.this==>赋值(window)
开始执行全局代码.
2、函数执行上下文
在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象
对局部数据进行预处理:
- 1.形参变量==>赋值(实参)
- 2.arguments==>赋值(实参列表)
- 3.处理 var定义的局部变量
- 4.处理 function声明的函数
- 5.提升
- 6.this==>赋值(调用函数的对象)
开始执行函数体代码
3、变量的查找
如果要查找一个