执行上下文&执行上下文栈
简单来说,执行上下文可理解为当前代码执行的环境。在js中代码执行环境分为全局环境和函数(局部)环境,js中的执行上下文可分为全局执行上下文和函数执行上下文
js如何管理执行上下文
在js中,执行上下文是以栈(先进先出的数据结构)的方式存放管理的,该栈称为执行上下文栈。
在js代码执行时,最开始全局执行上下文入栈,如果遇到函数的执行,则函数执行上下文入栈,函数执行完毕后,该函数执行上下文出栈,如果再遇到函数,则重复相同的步骤。。。最后全局执行上下文出栈
不难推断出,在执行上下文栈中,全局执行上下文总是在栈底,而栈顶是正在执行的函数执行上下文
一个例子
1 | function fn2() { |
这段代码的执行栈变化情况是如何的呢?
答案是:
全局上下文创建并入栈 》fn1上下文创建并入栈 》fn2上下文创建并入栈 》fn2上下文出栈 》fn1上下文出栈 》全局上下文出栈
在执行上下文中,有3个重要的属性,分别是:1.变量对象; 2.作用域链; 3.this指向
变量对象
关于变量对象,笔者了解得不多,故在此不作深入讨论
执行上下文的创建阶段会生成变量对象,生成变量对象主要有以下3个过程:
1.检索当前上下文中的参数;
2.检索当前上下文中的函数声明;
3.检索当前上下文中的变量声明
作用域链
我们知道,当执行上下文的执行阶段需要查找变量时,会首先在当前上下文中查找,如果没有查找到,则会沿着上层执行上下文查找,直到查找到全局作用域为止
在这过程中,当前上下文便是通过作用域链来有序地查找所需要的变量的
作用域链是如何建立的
js中作用域分为全局作用域和函数作用域,函数作用域是在函数被声明时确定的
每个函数都有一个scope属性,在函数声明的时候,该函数的scope属性会保存其上层执行上下文的变量对象,形成包含上层执行上下文变量对象的层级链,scope属性是在函数声明时确定的
执行上下文中的this
常见的this分这几种:全局上下文中的this,函数中的this,构造函数中的this
关于this有以下几点强调:
- this的指向是在函数调用时确定的
- this总是指向一个对象
- this总是指向函数的直接调用者,当函数被独立调用时,其this指向全局变量
- 注意箭头函数和普通函数this的不同