美文网首页
执行上下文 作用域链 伪代码

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

作者: 古_道_西_风_瘦_马 | 来源:发表于2018-02-09 17:43 被阅读0次
    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: {...} 
      }
    

    相关文章

      网友评论

          本文标题:执行上下文 作用域链 伪代码

          本文链接:https://www.haomeiwen.com/subject/bmyttftx.html