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

image.png

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 = [
////栈顶 
  <foo>functionContext

  <fun>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: {...} 
  }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容