闭包:
简单来说:
闭包就是函数中的函数,就是说一个函数要访问另外一个目标函数内部的变量,就要在目标函数中再定义一个函数(以此来把作用域链往下延长一段,目的就是为了利用js在找自由变量时,会沿着作用域链一级一级往上找的特点),并将这个定义的函数return出来,供外部使用。
JS 的闭包包含以下要点:
- 函数声明的时候,会生成一个独立的作用域。
- 同一作用域的对象可以互相访问。
- 作用域呈层级包含状态,形成作用域链,子作用域的对象可以访问父作用域的对象,反之不能;另外子作用域会使用最近的父作用域的对象。
闭包是指有权访问另一个函数作用域内变量的函数。 -- 《JavaScript高级程序设计》
说到闭包就得提什么是GC(垃圾回收机制)
简单来说:
- 如果变量没有被引用JS会隔一段时间周期性的释放变量占用的内存空间。
- 全局变量不会被回收,只有浏览器卸载页面时才会结束。
function a() {
var x = 1
var y = 100
console.log(y)
y++
return function b() {
console.log(x++)
}
}
var result= a()
//100
result()//1
result()//2
//
分析:
当执行result()
时为什么输出x累加呢?y为什么不输出,这里的y没有被全局变量引用所以被JS垃圾回收销毁所以不会输出。
多次执行result()
输出累加的x说明x并没有被销毁,因为b函数被映射到了全局变量result上,而b函数又依赖x变量,所以a函数中的x并不会被销毁。
闭包应用:
在实际开发中,闭包主要是用来封装变量实现公有私有变量,收敛权限。
优点:
- 变量长期驻扎在内存中。
- 避免全局变量的污染。
- 私有成员的存在。
缺点:
因为不会被GC回收,所以常驻内存,会增大内存的使用量,使用不当会造成内存泄露。