执行上下文 作用域链 伪代码

执行上下文 作用域链 伪代码_第1张图片
image.png

执行上下文 作用域链 伪代码_第2张图片
image.png

样例

var fun = function(x,y){
        if(true){  //不能创建作用域
                var a  =  11;
       }
        
    var foo = function(){
          console.log(a)
    }   
        foo(x,10)
}
fun()

上下文 函数栈

//JavaScript引擎会以栈的方式来处理它们,
//这个栈,我们称其为函数调用栈(call stack)。
//栈底永远都是全局上下文,而栈顶就是当前正在执行的上下文。

//数据结构  并不表示数组
ecstack = [
////栈顶 
  functionContext

  functionContext
  
  globalContext
  ////栈底

]

创建阶段

(executionContextObj = {
    variableObject: { /* 函数中的参数对象并给参数赋值, 内部的变量以及函数声明 */ },
    scopeChain: { /* variableObject 以及所有父执行上下文中的variableObject */ },
    this: {} 
  }

(funExecutionContextObj = {
    variableObject: { 
        arguments : {
          0 : 123,
          length : 1
          arguments obj
        },
        x : undefined,
        y : 10, 
        bar  : pointer to function bar(),
        a : undefined,
        foo :  undefined

    },
    scopeChain: { ... },
    this: {...} 
  }
fun.[[Scope]] = [
  globalContext.VO
];

执行阶段

fun.Scope = fun.AO + foo.[[Scope]]
(funExecutionContextObj = {
    variableObject: { 
        arguments : {
          0 : 123,
          length : 1
          arguments obj
        },
        bar  : pointer to function bar(),
        a : 11,
        foo :  pointer to function foo(),

    },
    scopeChain: [
      fun.AO
      globalContext.VO
    ],
    this: {...} 
  }

你可能感兴趣的:(执行上下文 作用域链 伪代码)