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);
<a name="hKbIY"></a>
## Extent
> 变量可以访问的时间段,从分配内存给它,到收回它的内存之间的时间
<a name="xfK1O"></a>
### 栈
变量的生存期跟作用域一致,出了作用域,生存期结束,变量所占用的内存也被释放
<a name="lO2jw"></a>
### 堆
变量的生存期跟语法上的作用域不一致,退出作用域以后仍然会存在
<a name="ONk7v"></a>
### 实现作用域
![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)
```javascript
BlockScope scope = (BlockScope) cr.node2Scope.get(ctx); //获得Scope
StackFrame frame = new StackFrame(scope); //创建一个栈桢
pushStack(frame); //加入栈中
...
//运行完毕,弹出栈
stack.pop();