You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
leta='Hello World!';functionfirst(){console.log('Inside first function');second();console.log('Again inside first function');}functionsecond(){console.log('Inside second function');}first();console.log('Inside Global Execution Context');
一、执行上下文
简单的来说,执行上下文是一种对
Javascript
代码执行环境的抽象概念,也就是说只要有Javascript
代码运行,那么它就一定是运行在执行上下文中执行上下文的类型分为三种:
window
对象,this
指向这个全局对象eval
函数中的代码,很少用而且不建议使用下面给出全局上下文和函数上下文的例子:
紫色框住的部分为全局上下文,蓝色和橘色框起来的是不同的函数上下文。只有全局上下文(的变量)能被其他任何上下文访问
可以有任意多个函数上下文,每次调用函数创建一个新的上下文,会创建一个私有作用域,函数内部声明的任何变量都不能在当前函数作用域外部直接访问
二、生命周期
执行上下文的生命周期包括三个阶段:创建阶段 → 执行阶段 → 回收阶段
创建阶段
创建阶段即当函数被调用,但未执行任何其内部代码之前
创建阶段做了三件事:
This Binding
伪代码如下:
This Binding
确定
this
的值我们前面讲到,this
的值是在执行的时候才能确认,定义的时候不能确认词法环境
词法环境有两个组成部分:
全局环境:是一个没有外部环境的词法环境,其外部环境引用为
null
,有一个全局对象,this
的值指向这个全局对象函数环境:用户在函数中定义的变量被存储在环境记录中,包含了
arguments
对象,外部环境的引用可以是全局环境,也可以是包含内部函数的外部函数环境伪代码如下:
变量环境
变量环境也是一个词法环境,因此它具有上面定义的词法环境的所有属性
在 ES6 中,词法环境和变量环境的区别在于前者用于存储函数声明和变量(
let
和const
)绑定,而后者仅用于存储变量(var
)绑定举个例子
执行上下文如下:
留意上面的代码,
let
和const
定义的变量a
和b
在创建阶段没有被赋值,但var
声明的变量从在创建阶段被赋值为undefined
这是因为,创建阶段,会在代码中扫描变量和函数声明,然后将函数声明存储在环境中
但变量会被初始化为
undefined
(var
声明的情况下)和保持uninitialized
(未初始化状态)(使用let
和const
声明的情况下)这就是变量提升的实际原因
执行阶段
在这阶段,执行变量赋值、代码执行
如果
Javascript
引擎在源代码中声明的实际位置找不到变量的值,那么将为其分配undefined
值回收阶段
执行上下文出栈等待虚拟机回收执行上下文
二、执行栈
执行栈,也叫调用栈,具有 LIFO(后进先出)结构,用于存储在代码执行期间创建的所有执行上下文
当
Javascript
引擎开始执行你第一行脚本代码的时候,它就会创建一个全局执行上下文然后将它压到执行栈中每当引擎碰到一个函数的时候,它就会创建一个函数执行上下文,然后将这个执行上下文压到执行栈中
引擎会执行位于执行栈栈顶的执行上下文(一般是函数执行上下文),当该函数执行结束后,对应的执行上下文就会被弹出,然后控制流程到达执行栈的下一个执行上下文
举个例子:
转化成图的形式
简单分析一下流程:
first
函数被调用,创建函数执行上下文并压入栈first
函数过程遇到second
函数,再创建一个函数执行上下文并压入栈second
函数执行完毕,对应的函数执行上下文被推出执行栈,执行下一个执行上下文first
函数first
函数执行完毕,对应的函数执行上下文也被推出栈中,然后执行全局上下文参考文献
The text was updated successfully, but these errors were encountered: