1,作用域
1.1什么是作用域:
变量能够被访问的范围
1.2 作用域的分类:
全局作用域 与 局部作用域
1.2.1 局部作用域 :
函数作用域(在函数内部声明 并 只能在函数内部使用,外部无法直接访问 ) 与 块作用域(js中被{}包裹的代码块)
1.2.2 全局作用域
1.位于 script 与 js 文件最外层 2. 全局作用域声明的变量其他作用域也可以使用
2. 作用域链
2.1 本质
底层的变量查找机制
2.2 嵌套关系的作用域组成了作用域链
当函数被执行时,会 优先查找 在 当前函数作用域 中 查找变量。如果当前函数作用域中未查询到变量,则会向 该函数的 父级作用域 查找,直至全局作用域
2.3 注意
1.父级作用域 无法访问 子级作用域
2.就近原则
3. 垃圾回收机制
3.1 内存的生命周期
1.内存分配(声明变量,函数,对象)
2.内存使用(对声明的 变量,函数,对象 进行使用)
3.内存回收(使用完毕 垃圾回收机制 对 内存进行回收)
3.2 内存泄漏
分配的内存 未释放 或者 无法释放
3.3 注意
全局变量:关闭页面回收
局部变量:使用完进行回收
3.4 垃圾回收算法
3.4.1 引用计数法
原理: 观察 对象 是否 有指向它的 引用, 当引用次数为0 则进行 回收
弊端: 当多个对象进行 嵌套引用 时 ,对象的 引用次数 不会为 0,导致无法回收,形成内存泄漏
3.4.2 标记清除法
原理:全局变量 定时 扫描 内存中的对象。能到达的对象,表示任在使用,不能到达的对象 则 会被标记 ,进行回收
4. 闭包
4.1 概念
一个函数对周围的引用状态捆绑在一起,内层函数能访问到外部函数的作用域
简易理解 闭包 = 内层函数 + 外层函数的变量
4.2 作用
封闭数据,实现数据私有,外部可以访问到函数内部的变量
4.3 风险
内存泄露
5. 变量提升
用 var 声明的 变量 提升到 当前作用域 的 最前面
只提升 变量声明 ,不提升 变量赋值
导致 未声明 先 使用