作用域
作用域表示当前的执行上下文,作用域表示变量和函数的可作用范围。最外层的为全局作用域(即:window对象),函数中的作用域为函数作用域,es6之后才有了块级作用域。
作用域链
作用域链就是通过在当前作用域内部查找需要的变量,如果有则访问,没有的话继续向上查找,直到找到为止 ,如果到window还没找到,就报错。
闭包是什么
红宝书:闭包是指引用了另外一个函数作用域中变量的函数。
闭包形成原因
内部的函数存在对外部作用域中变量的引用。
闭包的作用(好处)
-
保存函数的私有变量不受外界影响,使变量长期驻扎在内存中。
-
延长了函数的生命周期,把一些函数内的值保存下来,实现方法和属性的私有化,避免全局变量的污染。
闭包出现场景
-
在函数中返回一个函数,内层函数用到了外层函数作用域中的变量;
-
立即执行函数的内部有函数用到了被立即执行函数作用域中的变量;
-
循环产生定时器,且定时器内部用到了外部变量;
使用闭包应该注意
使用不当可能会造成内存泄漏。 不再用到的内存,没有及时释放(解决:最后将对象置空)
其他内存泄漏的情况
-
意外产生的全局变量(使用变量时拼写错误导致生成全局变量)
-
被遗忘的计时器或回调函数
垃圾回收机制
什么是垃圾回收机制?
确定哪个变量不在使用,让后释放其内存的周期性行为就是垃圾回收机制
闭包中的变量不会被垃圾回收机制所释放
为什么要进行垃圾回收?
程序不用的内存或者是之前用过了,以后不会再用的内存空间需要被释放
垃圾回收是怎样进行的?
标记清除算法:
-
先将内存中所有变量进行标记
-
然后将所有上下文中的变量及其所引用的变量的标记去除
-
之后回收依旧带有标记的变量