js进阶
作用域
作用域分为全局作用域和局部作用域
局部作用域
分为块级作用域 ( 就是使用 {} 包裹起来的代码称为代码块 )和函数作用域( 顾名思义就是函数包裹的部分 )
let 和 const 声明的常量会产生块级作用域 var不会产生块作用域
作用域链就是最底层的查找机制,其实就是就近原则。
垃圾回收机制
内存的生命周期
- 内存分配 声明变量、函数、对象的时候,系统会自动分配内存
- 内存使用 读写内存、也就是使用变量、函数等
- 内存回收 使用完毕,由垃圾回收器自动回收
全局变量不会回收
局部变量会自动回收
内存泄漏 程序中分配的内存由于某种原因程序未释放或无法释放叫做内存泄漏
- 栈:基本数据类型,由操纵系统自动分配函数的参数值,局部变量
- 堆:复杂数据类型,由垃圾回收机制回收
算法说明:
- 引用计数法
如果没有对象对它进行引用,那么就会被回收
缺点 :嵌套引用会出问题 ,如果俩个对象相互引用,垃圾回收器不会回收,从而导致内存泄漏。
- 标记清除法
从根部定期扫描,凡是能到达的对象,都是还需要使用的,无法到达的标记为不再使用,并且进行回收
闭包
一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域
作用:封闭数据、提供操作,外部可以访问函数内部的变量
变量提升
它允许在变量声明之前即被访问(仅仅存在于 var 声明的变量)
变量在 var 声明之前被访问,变量的值为 undefined ,变量提升只存在当前作用域下。
函数也是可以先声明之前就被调用
函数表达式不能,会出问题
动态参数 arguments
是函数内部内置的伪数组变量,只存在函数中,作用是动态获取函数的实参。
剩余参数
...变量名字
... 是语法符号,置于最末函数形参之前,用于获取 多余 的实参
借助 ... 获取的剩余实参,是个真数组,开发中,提倡多使用 剩余参数
箭头函数的 this 不会创建自己的 this ,它只会从自己的作用域脸的上一层沿用 this