作用域&&结构&&箭头函数
# 作用域
# 概念
规定了变量能够访问的一个范围,离开这个范围"变量"就不能被访问
# 全局作用域
注意:
- 因为window对象添加属性也是全局的
- 函数中未声明的关键字变量为全局变量
- 尽可能声明全局变量,防止全局变量被污染
# 局部作用域
# 函数作用域
函数内部声明的变量只能被函数内部访问,外部无法直接访问。
function fun() {
let name = 'lisi'
console.log(name) // lisi
}
console.log(name) // 此处报错,函数外部不能使用函数内部的局部变量
1
2
3
4
5
2
3
4
5
总结:
- 函数内部声明的变量,在函数外部无法被访问
- 函数的参数也是函数内部的局部变量
- 不同的函数内部声明的变量无法互相访问
- 函数执行完毕后,函数内部的变量实际被清空了
# 块作用域
{},代码块内部声明的变量外部将有可能无法被访问到
for(var i = 0; i<= 10; i ++) {
// 代码块
console.log(i)
}
console.log(i)
1
2
3
4
5
2
3
4
5
总结:
- let声明的变量会产生块作用域,var声明的变量不会产生块作用域
- const声明的变量会产生块作用域
- 不同代码块之间变量不能互通访问
- 推荐使用let和const
# 作用域链
本质就是底层变量的查找机制
- 在函数被访问时,优先查找当前函数作用域中的变量
- 如果当前查找不到则会依次逐级查找父级作用域直到全局作用域
话术:当前作用域查找,如果当前作用域没有,到上一级作用域查找,一直查找查找到最近的,一直查找到全局作用域为止
- 作用域链的本质是什么?
- 作用域链的查找规则是什么?
# 垃圾回收机制 GC
JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收的 js内存的生命周期
- 分配内存
- 使用内存
- 回收内存 说明: 全局变量一般不会回收 局部变量的值不用了,就会自动回收
内存泄漏:程序中分配的内存某种原因无法释放或者未释放叫做内存泄漏
js垃圾回收机机制的方法:标记清除法和引用计数法
- 标记清除法
比如我们定义了一个数组,然乎这个数组会在栈里面开辟一个内存地址,指向堆里面的数组,表示数组被引用了,我们就标记为1;
当我们把变量赋值为一个null,没有内存地址指向这个数组,没有被引用就变成0自动就被回收了
嵌套或两个对象相互应用会导致内存泄漏 - 引用计数法
从根部扫描对象,能查到的就是使用的,查不到就要回收
上次更新: 2023/03/05, 15:03:00