前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)

目录

作用域

局部作用域

函数作用域

块作用域

全局作用域

作用域链

JS垃圾回收机制

垃圾回收机制算法说明:

引用计数法(了解):

标记清除法:

闭包

为什么要有闭包?

闭包的风险→内存泄漏

变量提升

函数进阶

函数提升

函数参数

动态参数arguments

剩余参数...

vs展开运算符

箭头函数

基本语法

箭头原函数参数

箭头函数this

解构赋值

数组解构

js中两种必须加分号情形

变量少,单元值多

变量多,单元值少

按需导入

多维数组解构

对象解构

解构时修改变量名

多级对象解构


作用域

规定了变量被访问的“范围”,离开了这个范围变量将不能被访问。

局部作用域

函数作用域

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第1张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第2张图片

块作用域

不同块之间是无法相互访问的。这里的有可能是指若用var声明变量,则不会产生块作用域

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第3张图片

全局作用域

尽可能少地声明全局变量

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第4张图片

作用域链

作用域链是变量查找机制。

依次逐级地往外查找。

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第5张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第6张图片

JS垃圾回收机制

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第7张图片前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第8张图片

内存泄漏:分配的内存由于某种程序未释放或者无法释放叫内存泄漏

垃圾回收机制算法说明:

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第9张图片

引用计数法(了解):

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第10张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第11张图片

标记清除法:

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第12张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第13张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第14张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第15张图片

因此这就是为什么函数执行完后其内部变量会被释放,就是遵循标记清除法的垃圾回收机制。

闭包

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第16张图片

里层函数用到了外层函数声明的变量→产生闭包

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第17张图片

为什么要有闭包?

通常是里层函数可访问外层函数变量

但若外层函数要访问内层函数的变量此时可以使用闭包方式

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第18张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第19张图片

闭包的风险→内存泄漏

因为result = fun() 为全局变量,指向fn() i被反复使用,因此由标记清除法,i能被根节点找到→i作为局部变量无法被释放→内存泄漏

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第20张图片

变量提升

变量提升,即在执行代码之前会将当前作用域所有var声明的此变量提升,只提升声明,不提升赋值。let/const 不存在变量提升,实际开发中仍先声明后使用。

→  undefined件  10

实际上,上述代码因为变量提升的只提升声明不提升赋值,因此等价于

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第21张图片

函数进阶

函数提升

函数提升即会把所有函数声明提升到当前作用域的最前面。

只提升函数声明,不提升函数调用。

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第22张图片前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第23张图片

若对此种函数进行var赋值,由于var的变量提升(只提升声明,不提升赋值(函数表达式),则)

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第24张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第25张图片

因此,函数表达式(因为需赋值)必须先声明后调用

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第26张图片

函数参数

动态参数arguments

当不确定函数会传递多少个参数时,用动态参数。是伪数组。

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第27张图片

剩余参数...

  剩余参数也是只存在于函数里面是真数组!

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第28张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第29张图片

vs展开运算符

将数组进行展开。数组展开后元素之间是有逗号的。

而展开运算符 是正常情形下都可以用!

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第30张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第31张图片

箭头函数

箭头函数 特别重要!

基本语法

箭头函数主要是用在函数表达式中。

 箭头函数的目的就是简化代码。
前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第32张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第33张图片

函数体只有一行且为return时 return可以省略

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第34张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第35张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第36张图片

因为对象的{}与函数的{}冲突了 因此得用()包起来

箭头原函数参数

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第37张图片

箭头函数this

以前this的指向,粗略的规则,谁调用的这个函数,this就指向谁。对象里头的方法this指向是指向对象本身。但是!箭头函数没有this,因此其中的this要到上一层的作用域链中寻找

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第38张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第39张图片

解构赋值

数组解构

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第40张图片

利用数组解构来交换两个变量,则不需要像以前那样声明中间变量

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第41张图片

js中两种必须加分号情形

其中一种为数组解构前面有语句的

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第42张图片

变量少,单元值多

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第43张图片

可采用剩余参数来解决变量少单元值多的问题

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第44张图片

变量多,单元值少

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第45张图片

类似函数形参初始化的写法,来避免变量多单元制少的问题

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第46张图片

按需导入

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第47张图片

多维数组解构

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第48张图片

 

对象解构

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第49张图片

解构时修改变量名

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第50张图片

多级对象解构

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第51张图片

前端day23--JS进阶(作用域,垃圾回收机制,闭包,剩余参数,箭头函数,解构)_第52张图片

你可能感兴趣的:(前端学习,前端,javascript,开发语言)