作用域
作用域指程序中定义变量的区域,它决定了当前执行代码对变量的访问权限。
由于作用域的限制,每段独立的执行代码块只能访问自己作用域和外层作用域中的变量,无法访问到内层作用域的变量。
-
全局作用域
全局作用域为程序的最外层作用域,一直存在。
-
函数作用域
函数作用域只有函数被定义时才会创建,包含在父级函数作用域 / 全局作用域内。
作用域链
当可执行代码内部访问变量时,会先查找本地作用域,如果找到目标变量即返回,否则会去父级作用域继续查找…一直找到全局作用域。我们把这种作用域的嵌套机制,称为 作用域链。
闭包
能够访问其他函数内部变量的函数称为闭包
- 场景:柯里化函数
内存泄露
当一块内存不再被应用程序使用的时候,由于某种原因,这块内存没有返还给操作系统或者内存池的现象。内存泄漏可能会导致应用程序卡顿或者崩溃。
除闭包外, 全局变量的无意创建也可能导致内存泄露
垃圾回收机制
js中的垃圾回收机制是 引用计数收集:即当内存中的一个变量被引用一次,计数就+1。垃圾回收机制会以固定的时间轮询这些变量,将计数为 0的变量标记为失效变量并将之清除从而释放内存。
但闭包导致把作用域与外部环境隔离开,变量的引用都在函数内部完成,导致一直占用这个变量,JS 引擎无法判断你什么时候还会调用闭包函数,只能一直让这些数据占用着内存。当闭包使用过度导致内存无法释放,称之为内存泄露