Scope

variable, function, class

  • scope有大小区分,外部变量可以在外部及内部访问,内部变量只能在内部访问
  • 变量的scope从声明以后开始
  • 内部可以声明同名变量,会覆盖外部 ```javascript /**
    • Scope.js
    • 测试JavaScript的作用域 */ let a = 5; let b = 6; console.log(“1: “, a, b);

if (a > 0) { a = 4; let b = 3; console.log(“2: “, a, b); } else { let b = 4; console.log(“3: “, a, b); }

console.log(“4: “, a, b);

  1. <a name="hKbIY"></a>
  2. ## Extent
  3. > 变量可以访问的时间段,从分配内存给它,到收回它的内存之间的时间
  4. <a name="xfK1O"></a>
  5. ### 栈
  6. 变量的生存期跟作用域一致,出了作用域,生存期结束,变量所占用的内存也被释放
  7. <a name="lO2jw"></a>
  8. ### 堆
  9. 变量的生存期跟语法上的作用域不一致,退出作用域以后仍然会存在
  10. <a name="ONk7v"></a>
  11. ### 实现作用域
  12. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/155952/1642245949676-c44f5a45-b75f-41b0-a9e7-436764f85346.png#clientId=u798e1ac2-a829-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=276&id=ub58be053&margin=%5Bobject%20Object%5D&name=image.png&originHeight=276&originWidth=489&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29825&status=done&style=none&taskId=u8c2ea710-1cd3-4ba5-b28f-eefcd5c321f&title=&width=489)
  13. ```javascript
  14. BlockScope scope = (BlockScope) cr.node2Scope.get(ctx); //获得Scope
  15. StackFrame frame = new StackFrame(scope); //创建一个栈桢
  16. pushStack(frame); //加入栈中
  17. ...
  18. //运行完毕,弹出栈
  19. stack.pop();