- 作用域
es6就是往上都是es6 规定了变量生效的范围 var 只有函数作用域
1.1 局部作用域 & 全局作用域
局部作用域 : 函数作用域 函数的形参是局部作用域 最外层声明的变量 script 标签内部 、 js 文件
块作用域 : 使用 {} 包裹的 let 和 connst 声明的是块作用域 var 不能声明块作用域
1.2 作用域链
作用域链的本质是底层的变量查找机制
1.3 垃圾回收机制 & 闭包
内存不使用了 就会被垃圾回收器自动回收
垃圾回收的主要是内存 GC garbage collection
变量的生命周期 : 分配内存 - 使用 - 回收
引用计数法 缺点:嵌套引用 互相指向对方 , 一直不会被销毁
标记清除法 找不到就清除
闭包
概念:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域 外部可以访问函数内部的变量,可以实现变量的私有
function count() {
let i = 0
return function () {
i++
console.log(函数被调用了${i}次
)
}
}
const fun = count() // 实际fun 就是返回的 匿名函数 实际上之调用了1 次count 函数 所以 i 可以一直累加
count()() //函数被调用了1次
count()() //函数被调用了1次
count()() //函数被调用了1次
// 注意: count()() 每次调用count 每次的 i 都是在不同作用域生效
闭包的作用:让外部操作函数内部的变量 , 延长了变量的生命周期;
使用闭包时 常常把内层的函数当作return 值;eg:柯里化函数
闭包容易形成内存泄漏
柯里化函数的使用
柯里化函数
1.4 变量提升
var
注意:只提升声明 , 不提升赋值
-
函数进阶
2.1 函数提升
推荐先声明 后调用 -
把所有的函数声明提升到当前作用域的最前面
-
只会提升函数声明 , 不会提升函数调用
注意:函数表达式 必须先声明 后调用
2.2 动态参数 arguments
伪数组arguments 不能使用数组的push 等方法
arguments伪数组 依次接收传入的实参
View Code
2.3 剩余参数
推荐使用
只能存在函数里面
(a,b,…arr) arr 是真数组 , 数组的方法和属性都可以使用 (a,b,…arr) 表示 a 接收第一个实参 , b 接收第二个实参 , arr 接收剩余所有的实参
注:箭头函数没有arguments
View Code
2.4 展开运算符
就是展开数组的每一项
使用场景: a)求数组的最值 b) 合并数组 c) 把伪数组转换为真数组 ps :Array.from 方法也是转换真数组的
转换真数组
展开运算符和剩余参数主要区别就是写的位置不同
<script>
const arr = [1, 2, 3, 42, 23]
console.log(...arr) // 不会修改源数组
// 使用场景: a)求数组的最值 b) 合并数组
// console.log(Math.max(1, 2, 4, 6)) //()数字类型
console.log(Math.max(...arr))
console.log(Math.min(...arr))
// 合并数组
const arr2 = [89, 34, 23]
const newArr = [...arr, ...arr2]
console.log(...arr)
console.log(...arr2)
console.log(...newArr)
</script>
2.5 箭头函数
箭头函数是函数表达式 ,需要先声明后使用;
const fn = (形参列表) => {函数体}
箭头函数没有arguments动态参数
箭头函数没有自己的 this 箭头函数不会自己创建this ,他会从自己的作用域链的上一层沿用this指向 , 既可以在上一层打印thsi 确定 ,上一层就是上一个{}
严格模式下 this 时undefined
箭头函数使用在本来需要匿名函数的地方
箭头函数的简写
View Code
3. 解构赋值 重要 就是简洁的语法格式
后面天天用 offen use
必须加分号的场合:
a)自执行函数
b)数组[] 开头
数组有序赋值 根据顺序赋值
对象无序赋值 根据变量名赋值
3.1 数组解构
就是一种简洁的语法 解构的作用:简单来说就是简化信息提取
防止undefined 传递 可以只用默认值 ,类似形参设置默认值
剩余参数只能放在最后
使用场景:交换 2 个变量 a b 必使用 分号 ‘;’
3.2 对象解构
属性名 和 变量名相同 对象解构是按照属性名一一对应的 即只要属性名和变量名相同 , 顺序可以不同
改变变量名 : 旧的变量名:新的变量名 注意: 旧的变量名要和属性名一致
3.3 数组对象解构
3.4 forEach
forEach只遍历数组 ,没有返回值,语法和map()类似 , arr.forEach(function (元素 , 【索引号可选】){})