深切进修js之——实行上下文

《深切进修js之——实行上下文栈》中说过,当JavaScript代码实行一段可实行代码(executable code)时,会建立对应的实行上下文(execution context)

关于每个实行上下文,都有三个主要的属性:

变量对象(Variable object VO)

作用域链(Scope chain)

this

本文我们结合著这三个部份的内容,讲讲实行上下文的细致处置惩罚历程。

思考题

《深切进修js之——词法作用域和动态作用域》中,提出如许一道思考题:

// 思考题一:
var scope = "global scope";
function checkscope(){
  var scope = "local scope";
  function f(){
    return scope;
  }
  return f();
}
checkscope();

// 思考题二:
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

两段代码都邑打印local scope,然则照样有些许差别的,本文就细致的剖析实行上下文栈实行上下文的细致变化历程。

细致剖析

我们剖析第一段代码:

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();

实行历程以下:

1、实行全局代码,建立全局实行上下文,全局上下文被压入实行上下文栈

ECStack = [
  globalContext
];

2、全局上下文初始化

globalContext = {
  VO: [global],
  Scope: [globalContext.VO],
  this: globalContext.VO
}

2、初始化的同时,checkscope 函数被建立,保留作用域链到函数内部的属性[[scope]]

checkscope.[[scope]] = [
  globalContext.VO
];

3、实行checkScope 函数,建立checkScope 函数实行上下文,checkScope 函数实行上下文被压入实行上下文栈:

ECStack = [
  checkscopeContext,
  globalContext
];

4、checkscope 函数实行上下文初始化:

1.复制函数 [[scope]] 属性建立作用域链,

2.用 arguments 建立运动对象,

3.初始化运动对象,即到场形参、函数声明、变量声明,

4.将运动对象压入 checkscope 作用域链顶端,

同时 f 函数被建立,保留作用域链到 f 函数的内部属性[[scope]]

checkscopeContext = {
  AO: {
      arguments: {
        length: 0
      },
      scope: undefined,
      f: reference to function f(){}
  },
  Scope: [AO, globalContext.VO],
  this: undefined
}

5、实行f函数,建立 f 函数实行上下文,f 函数实行上下文被压入实行上下文栈

  ECStack = [
    fContext,
    checkscopeContext,
    globalContext
  ]

6、f 函数实行上下文初始化, 以下跟第 4 步雷同:

1.复制函数
[[scope]] 属性建立作用域链

2.用 arguments 建立运动对象

3.初始化运动对象,即到场形参、函数声明、变量声明

4.将运动对象压入 f 作用域链顶端

  fContext = {
    AO: {
        arguments: {
            length: 0
        }
    },
    Scope: [AO, checkscopeContext.AO, globalContext.VO],
    this: undefined
  }

7、f 函数实行,沿着作用域链查找 scope 值,返回 scope 值

8、f 函数实行终了,f 函数上下文从实行上下文栈中弹出

ECStack = [
  checkscopeContext,
  globalContext
]

9、checkscope 函数实行终了,checkscope 实行上下文从实行上下文栈中弹出

ECStack = [
  globalContext
]
    原文作者:Louis
    原文地址: https://segmentfault.com/a/1190000018520764
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞