目录
作用域
局部作用域
函数作用域
块作用域
全局作用域
作用域链
JS垃圾回收机制
垃圾回收机制算法说明:
引用计数法(了解):
标记清除法:
闭包
为什么要有闭包?
闭包的风险→内存泄漏
变量提升
函数进阶
函数提升
函数参数
动态参数arguments
剩余参数...
vs展开运算符
箭头函数
基本语法
箭头原函数参数
箭头函数this
解构赋值
数组解构
js中两种必须加分号情形
变量少,单元值多
变量多,单元值少
按需导入
多维数组解构
对象解构
解构时修改变量名
多级对象解构
作用域
规定了变量被访问的“范围”,离开了这个范围变量将不能被访问。
局部作用域
函数作用域
块作用域
不同块之间是无法相互访问的。这里的有可能是指若用var声明变量,则不会产生块作用域
全局作用域
尽可能少地声明全局变量
作用域链
作用域链是变量查找机制。
依次逐级地往外查找。
JS垃圾回收机制
内存泄漏:分配的内存由于某种程序未释放或者无法释放叫内存泄漏
垃圾回收机制算法说明:
引用计数法(了解):
标记清除法:
因此这就是为什么函数执行完后其内部变量会被释放,就是遵循标记清除法的垃圾回收机制。
闭包
里层函数用到了外层函数声明的变量→产生闭包
为什么要有闭包?
通常是里层函数可访问外层函数变量
但若外层函数要访问内层函数的变量此时可以使用闭包方式
闭包的风险→内存泄漏
因为result = fun() 为全局变量,指向fn() i被反复使用,因此由标记清除法,i能被根节点找到→i作为局部变量无法被释放→内存泄漏
变量提升
变量提升,即在执行代码之前会将当前作用域的所有var声明的此变量提升,只提升声明,不提升赋值。let/const 不存在变量提升,实际开发中仍先声明后使用。
→ undefined件 10
实际上,上述代码因为变量提升的只提升声明不提升赋值,因此等价于
函数进阶
函数提升
函数提升即会把所有函数声明提升到当前作用域的最前面。
只提升函数声明,不提升函数调用。
→
若对此种函数进行var赋值,由于var的变量提升(只提升声明,不提升赋值(函数表达式),则)
→
因此,函数表达式(因为需赋值)必须先声明后调用
函数参数
动态参数arguments
当不确定函数会传递多少个参数时,用动态参数。是伪数组。
剩余参数...
剩余参数也是只存在于函数里面。是真数组!
vs展开运算符
将数组进行展开。数组展开后元素之间是有逗号的。
而展开运算符 是正常情形下都可以用!
箭头函数
箭头函数 特别重要!
基本语法
箭头函数主要是用在函数表达式中。
箭头函数的目的就是简化代码。
函数体只有一行且为return时 return可以省略
→
因为对象的{}与函数的{}冲突了 因此得用()包起来
箭头原函数参数
箭头函数this
以前this的指向,粗略的规则,谁调用的这个函数,this就指向谁。对象里头的方法this指向是指向对象本身。但是!箭头函数没有this,因此其中的this要到上一层的作用域链中寻找
解构赋值
数组解构
利用数组解构来交换两个变量,则不需要像以前那样声明中间变量
js中两种必须加分号情形
其中一种为数组解构前面有语句的
变量少,单元值多
可采用剩余参数来解决变量少单元值多的问题
变量多,单元值少
类似函数形参初始化的写法,来避免变量多单元制少的问题
按需导入
多维数组解构