作用域
局部作用域
分为函数作用域和块作用域
var不会产生块作用域
全局作用域
函数中未使用任何关键字声明的变量为全局变量
作用域链
子作用域能够访问父作用域,父级作用域无法访问子级作用域像在g函数中声明一个b f函数是无法访问的

垃圾回收机制GC
什么是垃圾回收机制
垃圾回收机制的算法
引用计数法
但它却存在一个致命的问题:嵌套引用(循环引用) 如果两个对象相互引用,尽管他们已不再使用,垃圾回收器不会进行回收,导致内存泄露。
标记清除法
闭包
闭包 = 内层函数 + 外层函数的变量
关键是返回函数,把函数赋值给全局的变量
典型例子
总结
变量提升和函数提升
打印出undefined 因为var有变量提升,会把var num提到当前的作用域的最前面但是没有赋值
函数提升
能在声明前调用函数 因为代码执行前会把所有函数的声明都提到当前作用域最前面
这个函数调用错误 因为函数表达式没有提升,它是一个赋值操作
函数参数
动态参数arguments
剩余参数 ...other
总结
展开运算符
可以将数组展开 ...arr1=1,2,3
典型应用:求最大最小值和合并数组
箭头函数(重要)
箭头函数更适用于那些本来需要匿名函数的地方
基本语法
1. 箭头函数属于表达式函数,因此不存在函数提升
2、只有一个参数可以省略小括号
3、如果函数体只有一行代码,可以写到一行上,并且无需写 return 直接返回值
4.加括号的函数体返回对象字面量表达式,就是返回对象时 对象本生带{} 函数体也有{} 分不清
就把函数体的{}写成()如下:
箭头函数的参数
用箭头函数求和
箭头函数this的指代
箭头函数不会创建自己的this,它只会从自己的作用域链的上一层沿用this
就是看上一层作用域的this指向谁(一般函数是谁调用函数 this指向谁)
数组解构
就是把数组里的元素快速批量地赋值给变量的语法
典型应用
必须加分号的情况
变量和单元值数量不相等时
1、变量的数量大于单元值数量时,多余的变量将被赋值为 undefined
2、利用剩余参数解决变量少 单元值多的情况:剩余参数返回的还是一个数组
3.防止有undefined传递单元值的情况,可以设置默认值
4、按需导入,忽略某些返回值
5、支持多维数组的结构
对象解构
对象解构是将对象属性和方法快速批量赋值给一系列变量的简洁语法
1. 赋值运算符 = 左侧的 {} 用于批量声明变量,右侧对象的属性值将被赋值给左侧的变量
2. 对象属性的值将被赋值给与属性名相同的变量
3. 注意解构的变量名不要和外面的变量名冲突否则报错
4.对象中找不到与变量名一致的属性时变量值为 undefin
变量名要和属性名一样
要想变量名和属性名不一样咋办
数组对象解构
多级对象结构
选出data进行传参