【JavaScript】JavaScript 进阶-1(更新中)
目录
- 作用域&解构&箭头函数
- 作用域 2024.10.23
- 局部作用域
- 全局作用域
- 作用域链(变量查找机制)
- JS垃圾回收机制GC
- 闭包 Closure(内层函数+外层变量)
- 变量提升
- 函数进阶 2024.10.24
- 函数提升
- 函数参数
- 箭头函数(重要)
- 解构赋值 2024.10.24
- *综合案例
作用域&解构&箭头函数
作用域 2024.10.23
局部作用域
- 函数作用域
- 块作用域(大括号{}内部)
let、const 会产生块作用域,var不会(不推荐使用)
全局作用域
- script 标签、.js文件最外层 (尽量少使用)
作用域链(变量查找机制)
- 就近原则:优先查找当前作用域,逐级查找父级作用域,直到全局作用域
JS垃圾回收机制GC
- 生命周期(内存分配、使用、回收)
全局变量一般不回收,局部变量自动回收 - 内存泄露(内存未释放或无法释放)
- 算法说明
栈:自动,基本数据类型
堆:手动,复杂数据类型- 引用计数法(不再使用的对象——跟踪记录被引用的次数)
问题:嵌套/循环引用——内存无法释放——内存泄露 - *标记清除法(无法达到的对象——标记根部可到达——回收未被标记的)
解决了嵌套/循环引用
- 引用计数法(不再使用的对象——跟踪记录被引用的次数)
闭包 Closure(内层函数+外层变量)
// 简单写法
function outer(){const a = 1function f(){console.log(a) //内层函数访问到外层函数的作用域}f()
}
outer()// 常见写法
function outer(){const a = 1return function(){console.log(a)}
}
const fun = outer()
fun() //调用函数
- 作用:外部访问函数内部的变量
- 应用:实现数据私有(数据封装)
function count(){let i = 0return function(){i++console.log(i)}
}
const fun = count()
fun() //调用函数
- 问题:内存泄露
变量提升
把所有var的变量声明提升到当前作用域的最前面
注意: 只提升变量声明,不提升变量赋值; let、const不存在变量提升; 相同的作用域; 推荐先声明再访问
函数进阶 2024.10.24
函数提升
把所有函数声明提升到当前作用域的最前面
// 错误
fun()
var fun = function(){console.log("函数表达式 不存在提升")
}
函数参数
- 动态参数 (arguments: 伪数组)
- 剩余参数 (…arr: 真数组):推荐使用
展开运算符: …
应用:
Math.max(...arr) //数组最大值
const arr = [...arr1, ...arr2] //合并数组
箭头函数(重要)
- 使用场景:替代匿名函数
- 基本语法:
const fn = function(){} // 匿名函数
const fn = () => {} // 箭头函数
const fn = x => console.log(x)
const fn = x => x + x
const fn = () => ({key:value})
- 注意:表达式函数,无函数提升;
- 箭头函数参数:无动态参数,有剩余参数
- this:
传统:谁调用指向谁;箭头函数没有自己的this,指向上一层作用域的this(事件监听DOM回调函数不推荐使用箭头函数)