js高级-作用域和闭包

作用域(scope):
变量和函数能作用的范围,一块代码区域。
用于确定在何处以及如何查找变量的一套规则。

分为:全局全用域和局部作用域,以及块级作用域(es6新增)
全局作用域:整个script标签或者一个单独的js文件
局部作用域:在函数内的就是局部作用域

用途:
提高程序可靠性;隔离变量,不同作用域下的同名变量不会冲突

全局变量:在全局作用域下定义的变量,只有在浏览器关闭时才销毁,比较占用内存。
局部变量:函数内定义的变量,包括形参也是局部变量,当函数调用完毕即销毁。

作用域嵌套:
当一个函数或块嵌套另一个函数或块的时候,就发生了作用于嵌套。
作用域链:
发生作用域嵌套时,由多个作用域变量对象构成的链表,叫作作用域链。
查找嵌套作用域链规则:js引擎查找变量的时候的会先从当前作用于查找,如找不到则从上一级作用于查找,当抵达最外层全局作用于时,无论找到还是找不到都会停止。
如果查找目的是赋值,js会使用LSH查询;如果目的是获取值,会使用RSH查询。
赋值操作会导致LHS,=操作或调用函数时传入参数的操作会导致RHS查询。不成功的RSH查询会导致ReferenceError异常,不成功的LSH会隐士创建一个全局变量(非严格模式下),或者抛出ReferenceError异常(严格模式)。

闭包:
函数在当前作用域之外执行时,这是就产生了闭包。内部函数持有外部函数作用域的引用,这个引用就是闭包。

一般情况下,当一个函数被调用后,其内部的整个作用域都会被销毁。因为引擎有垃圾回收器来释放不再使用的空间。但是闭包可以阻止这件事情发生。

作用:
延长局部变量的生命周期

闭包应用:
循环遍历加监听
模块化: 封装一些数据以及操作数据的函数, 向外暴露一些行为
JS框架(jQuery)大量使用了闭包

缺点:
变量占用内存的时间可能会过长
可能导致内存泄露
解决:
及时释放 : f = null; //让内部函数对象成为垃圾对象

原文地址:https://www.cnblogs.com/tingshu/p/15227438.html