目录
作用域、变量提升、闭包等语言特征,加深对 JavaScript 的理解,掌握变量赋值、函数声明的简洁语法,降低代码的冗余度。
作用域
作用域对程序执行的影响及作用域链的查找机制,使用闭包函数创建隔离作用域避免全局变量污染。
函数作用域
在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。
<script>
// 什么是作用域链: 变量的查找机制
// 大白话: 里面的函数能够看见外面的变量 ---外面看不见里面
// 官方: 变量查找的时候: 从内往外, 就近查找
// 全局变量a
let a = 1; // 全局变量 任何作用域都可以看见
function fn() {
// 局部变量 a ---- 在局部作用域里面声明的变量外面无法访问
let a = 10
function g() {
a = 20 // 这个a 是17行
console.log(a);
}
g()
}
fn()//20
内存泄漏、垃圾回收机制
什么是内存泄露?
占用的内存没有被及时释放,内存泄漏积累多了就导致内存溢出。
内存泄漏一般是指变量的内存没有及时的回收,导致内存资源浪费。一般有四种情况出现内存泄露比较多。
1. 常见的声明了一个全局变量,但是又没有用上,那么就有点浪费内存了。
2. 定时器没清除
3. 循环引用:A 对象里面有一个属性指向 B 对象,B 对象有一个属性指向 A 对象。互相引用
4. 闭包:匿名函数可以访问父级作用域的变量。那在使用完之后,也要及时释放掉
如何避免内存泄露
- 减少不必要的全局变量,或者声明周期较长的对象,对无用的数据及时垃圾回收
- 避免死循环之类的
- 避免创建过多的对象,
垃圾回收机制
垃圾回收机制: 有两个算法: 引用计数法 + 标记清除法
1. 引用计数法: 一个值不在被引用(引用次数为0),那么这个值就会被清除,内存就会被自动回收
2. 标记清除法
为什么还会出现第二种计数法: 因为 引用计数法 有一些问题 (循环引用的问题)
闭包
// 这个知识点 锻炼你们的编码能力
// 什么是闭包: 内层函数 + 访问了外层函数的变量 ----- 闭包就是函数(必须有两个条件)
// 下面代码来说, 闭包就是函数f
// 单词: Scope(作用域): Global(全局) + Local(局部)+ Closure(闭包)
// 用眼睛看,闭包在哪里----去浏览器的source面板,调试看一看
// 打断点的时候,不要乱点,去函数调用的位置去打,
// 全局作用域下面的函数 --- 全局函数
function f() {
// 函数f内的局部变量
const num = 10
// 内层函数
function g() {
// 在函数g的内部访问外层函数的变量num --- 为什么能访问到?
console.log(num);
}
g()
}
f()
</script>
闭包的作用:在函数的变量在外面是看不到的(数据的私有化),可以通过闭包来调用,访问函数内部的函数,尽量少的去定义全局变量。