执行上下文、可执行代码

V8引擎看待整个程序,将程序分成两部分:执行上下文(执行环境)和可执行代码。

  1. class EnvironmentRecord(){
  2. constructor(bindings){
  3. this.bindings = bindings || {};
  4. }
  5. createBinding(){}
  6. setBinding(){}
  7. hasBinding(){}
  8. getBindingValue(){}
  9. }
  10. class LexicalEnvironment(){
  11. constructor(environmentRecord, outer){
  12. this.environmentRecord = environmentRecord;
  13. this.outer = outer;
  14. }
  15. //获取标识符方法。
  16. getIdentify(){}
  17. }
  18. class ExecuteContext{
  19. constructor( lexicalEnvironment, thisBinding ){
  20. //词法环境
  21. this.lexicalEnvironment = lexicalEnvironment;
  22. //this指针
  23. this.thisBinding = thisBinding;
  24. }
  25. }
  26. class ExecuteContextStack{
  27. constructor(){
  28. this.executionContexts = []
  29. }
  30. push(){}
  31. pop(){}
  32. //获取当前的执行上下文。
  33. get current(){}
  34. }
  35. class Function() {
  36. constructor(name, code, scope){
  37. this.name = name;
  38. this.code = code;
  39. this.scope = scope;
  40. }
  41. }
  1. //创建全局环境记录项。
  2. const globalEnvironmentRecords = new EnvironemntRecode(global);
  3. //创建全局词法环境,外部词法环境为null
  4. const globalLexicalEnvironment = new LexicalEnvironment(globalEnvironmentRecords, outer = null);
  5. //创建全局执行上下文
  6. const globalExecuteContext = new ExecuteContext(globalLexicalEnvironment, this = global);
  7. //创建执行上下文栈
  8. const ExecuteContextStack = new ExecuteContextStack();
  9. ExecuteContextStack.push(globalExecuteContext);
  10. //编译阶段,登记全局变量a
  11. ExecuteContextStack.current.LexicalEnvironment.createBinding('a');
  12. ExecuteContextStack.current.LexicalEnvironment.setBinding('a', undefined);
  13. //登记函数,关键点在于当前函数所在的词法环境,作为函数的属性。(静态作用域)
  14. let oneFn = new Function('one', 'var b = 2; console.log(b)', ExecuteContextStack.current.LexicalEnvironment)
  15. ExecuteContextStack.current.LexicalEnvironment.createBinding('one');
  16. ExecuteContextStack.current.LexicalEnvironment.setBinding('a', oneFn);
  17. //执行赋值
  18. ExecuteContextStack.current.LexicalEnvironment.setBinding('a', 1);
  19. //函数执行,会创建一个新的词法环境
  20. const functionLexicalEnvironment = new LexicalEnvironment(fnEnvironmentRecords, oneFn.scope);

作用域

标识符对可执行代码的可见性。
执行上下文、可执行代码 - 图1

词法环境

词法环境本质上是一个类,用来定义标识符的属性和方法以及嵌套关系的类型。
关键点函数声明、with语句、try…catch语句都会创建一个新的词法环境。
执行上下文、可执行代码 - 图2

执行上下文

执行上下文 = 词法环境 + this
关键点词法环境是执行上下文的一个属性。
执行上下文、可执行代码 - 图3

可执行代码

对执行上下文进行修改的代码。
执行上下文、可执行代码 - 图4

参考

https://www.bilibili.com/video/BV1cR4y1F7ba?p=2