JS执行上下文栈和作用域链

一、JS执行上下文

执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行。

执行上下文类型分为:全局执行上下文和函数执行上下文。执行上下文创建过程中,需要做以下几件事:

 

(1)创建变量对象:首先初始化函数的参数arguments,提升函数声明和变量声明。

(2)创建作用域链(Scope Chain):在执行期上下文的创建阶段,作用域链是在变量对象之后创建的。

(3)确定this的值,即 ResolveThisBinding

 

二、作用域

  作用域就是变量和函数的可访问范围,控制这个变量或者函数可访问行和生命周期。

  作用域有两种工作模型:词法作用域和动态作用域,JS采用的是词法作用域工作模型,词法作用域意味着作用域是由书写代码时变量和函数声明的位置决定的。( with 和 eval 能够修改词法作用域,但是不推荐使用,对此不做特别说明)

  在 js 中是词法作用域,意思就是你的变量函数的作用域是由你的编码中的位置决定的,当然可以通过 applycall bind 等函数进行修改。

  在 ES6 之前,js 中的作用域分为两种:函数作用域和全局作用域,现在作用域分为:全局作用域、函数作用域、块级作用域。

  全局作用域顾名思义,浏览器下就是 window ,作用域链的顶级就是它,那么只要不是被函数包裹的变量或者函数,它的作用域就是全局。

  而函数作用域,就是在函数的体内声明的变量、函数及函数的参数,它们的作用域都是在这个函数内部。

三、JS执行上下文栈(后面简称执行栈)

  执行栈,也叫做调用栈,具有 LIFO (后进先出) 结构,用于存储在代码执行期间创建的所有执行上下文。

规则如下:

  首次运行JavaScript代码的时候,会创建一个全局执行的上下文并Push到当前的执行栈中,每当发生函数调用,引擎都会为该函数创建一个新的函数执行上下文并Push当前执行栈的栈顶。

当栈顶的函数运行完成后,其对应的函数执行上下文将会从执行栈中Pop出,上下文的控制权将移动到当前执行栈的下一个执行上下文。

四、作用域链

  我们知道函数在执行时是有个执行栈,在函数执行的时候会创建执行环境,也就是执行上下文,在上下文中有个大对象,保存执行环境定义的变量和函数,在使用变量的时候,就会访问这个大对象,这个对象会随着函数的调用而创建,函数执行结束出栈而销毁,那么这些大对象组成一个链,就是作用域链。那么函数内部未定义的变量,就会顺着作用域链向上查找,一直找到同名的属性。

你可能感兴趣的:(JS执行上下文栈和作用域链)