JS闭包理解应用

闭包:

简单来说:

闭包就是函数中的函数,就是说一个函数要访问另外一个目标函数内部的变量,就要在目标函数中再定义一个函数(以此来把作用域链往下延长一段,目的就是为了利用js在找自由变量时,会沿着作用域链一级一级往上找的特点),并将这个定义的函数return出来,供外部使用。

JS 的闭包包含以下要点:
  1. 函数声明的时候,会生成一个独立的作用域。
  2. 同一作用域的对象可以互相访问。
  3. 作用域呈层级包含状态,形成作用域链,子作用域的对象可以访问父作用域的对象,反之不能;另外子作用域会使用最近的父作用域的对象。

闭包是指有权访问另一个函数作用域内变量的函数。 -- 《JavaScript高级程序设计》


说到闭包就得提什么是GC(垃圾回收机制)

垃圾回收文章

简单来说:
  1. 如果变量没有被引用JS会隔一段时间周期性的释放变量占用的内存空间。
  2. 全局变量不会被回收,只有浏览器卸载页面时才会结束。
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并不会被销毁。


闭包应用:

在实际开发中,闭包主要是用来封装变量实现公有私有变量,收敛权限。

优点:
  1. 变量长期驻扎在内存中。
  2. 避免全局变量的污染。
  3. 私有成员的存在。
缺点:

因为不会被GC回收,所以常驻内存,会增大内存的使用量,使用不当会造成内存泄露。

你可能感兴趣的:(JS闭包理解应用)