1.声明变量三种关键字区别
var只有全局和局部作用域,没有块级作用域(如果写在块级作用域里,就是全局变量);let三个作用域都有
var定义的变量打印window,window下会有这个属性;而let定义的变量没有
var可以定义多个同名的变量,会覆盖前面的变量值;let如果定义多个同名的会报错
const和let差不多,但是const声明的变量不可以修改,一般用const声明常量
2.闭包
一个作用域能够访问另一个作用域的局部变量,意思就是返回了一个子函数,这个函数可以访问他父级的变量,全局变量也可以使用这个局部变量 通常返回的子函数是匿名函数
好处:扩大延伸了变量的使用范围
闭包缺点:局部变量销毁不掉,过度使用造成内存
3.预解析
变量预解析(变量提升):只解析声明变量的语句,把它提到当前作用域最前面 只定义不赋值
函数预解析(函数提升):只解析定义函数语法的语句,把它提到当前作用域前面 只声明不调用
变量只声明,不使用为undefined
变量名和函数名相同的话,函数优先
let定义变量的话,在它赋值之前的称为暂时性死区(不能使用这个变量)
变量为空是undefined,对象为空是null
4.参数
默认值
形参和实参
如果没有传实参,那么形参的值是undefined
如果把其他某位的值传给别的形参,而它的又要用自己的默认值,这时把实参定为undefined
动态参数
传的参数不固定用arguments,固定用形参的方式
arguments是函数内置的伪数组变量,不用定义,直接用即可
剩余参数
也叫rest参数
放到最后,它接收得是真数组,经常用它代替arguments
5.箭头函数
形式:()=> { } 匿名函数,严格来说是表达式函数
如果小括号里只有一个参数,可以省略小括号
箭头函数如果大括号只有一行代码,省略大括号,并且自动返回结果
注意事项:
箭头函数只能先定义后使用
箭头函数中没有arguments,只能用剩余函数...
箭头函数中this指向上级作用域
6.解构赋值
解开数据结构赋值给相应的变量
数组解构
形式:let [ ] = [ ]; 例如:let [a, b, c] = ['刘佳慧','你好','啊啊'];
注意是一一对应关系
数组解构:如果按需取值,用,占位即可
如果是复杂形势的,也是按照一一对应关系,使用,分割
对象解构
变量名当做属性名
写在哪个地方都行,不是一一对应关系,无顺序排列,对象属性的值赋给属性名相同的变量
对象中找不到与变量名一致的属性时的变量时为undefined
如果外面有这个变量,要用:改名