作用域(scope):
用于确定在何处以及如何查找变量的一套规则。也可以说是变量和函数能作用的范围,一块代码区域。
如果查找目的是赋值,js会使用LSH查询;如果目的是获取值,会使用RSH查询。
赋值操作会导致LHS,=操作或调用函数时传入参数的操作会导致RHS查询。不成功的RSH查询会导致ReferenceError异常,不成功的LSH会隐士创建一个全局变量(非严格模式下),或者抛出ReferenceError异常(严格模式)。
用途:
隔离变量,不同作用域下的同名变量不会冲突
作用域嵌套:
当一个函数或块嵌套另一个函数或块的时候,就发生了作用于嵌套。
查找嵌套作用于链规则:js引擎查找变量的时候的会先从当前作用于查找,如找不到则从上一级作用于查找,当抵达最外层全局作用于时,无论找到还是找不到都会停止。
作用域链:
发生作用域嵌套时,由多个作用域变量对象构成的链表,叫作作用域链。
作用域是由书写代码时函数声明的位置决定的,
闭包:
函数在当前作用域之外执行时,这是就产生了闭包。内部函数持有外部函数作用域的引用,这个引用就是闭包。
一般情况下,当一个函数被调用后,其内部的整个作用域都会被销毁。因为引擎有垃圾回收器来释放不再使用的空间。但是闭包可以阻止这件事情发生。
作用:
延长局部变量的生命周期
闭包应用:
循环遍历加监听
模块化: 封装一些数据以及操作数据的函数, 向外暴露一些行为
JS框架(jQuery)大量使用了闭包
缺点:
变量占用内存的时间可能会过长
可能导致内存泄露
解决:
及时释放 : f = null; //让内部函数对象成为垃圾对象