console.log(1)
function foo(i) {
    console.log(i);
    return i + 1;
}

function bar(j) {
   let k = foo(j);
   return k + 1;
}
console.log(bar(1))

global ec

bar ec

global ec

bar

foo

initEC

initEC()

global ec

bar

return 2

return 3

栈顶的函数:正在被执行的函数。

遇到新函数时压栈,执行完成后弹出(携带返回值)

global ec

global ec

interface EC {
   _scopeChain: VO []
  vo:VO
  thisObject:Object
}
interface VO {
  argument:any[];
  localVairables: [name:string]:undefined; 
  // 不是很严谨。函数声明的提升只会提升到block scope
  localFunctionDeclaration: [name:string]:Pointer
}
function variableLookup(variable) {
  if(variable in currEC.vo) {
    return found;
  };
  for(sc of currEC.scopeChain) {
     if(vairable in sc) {
       return found;
     }
  }
  throw new ReferrenceError();
}

exec func bar()

function codeExecute(ec) {
   // ec压栈
   // 开始执行
   //....
   //中途可能会遇到变量查找
   //....
  if(遇到需要执行函数){
      ec = initEC();
      ret = codeExecute(ec)
      // 可能dosomething(ret)
   }
  // 执行完成弹栈
}    
function initEC() {
   initScopeChain()
   let vo = {}
   
   // 1.变量提升 
   // 2. 先扫描函数。会忽略之后的变量 
   // 3. 函数声明和函数表达式
   scanFuncDeclaration(vo);
   scanLocalVariableDeclaration(vo); 
   
   initThisObject();
}
execute context

execute context

2019-11-14 10:44:47 0 55
这里是评论

相关推荐