美文网首页
JS闭包理解应用

JS闭包理解应用

作者: Zero_R | 来源:发表于2019-02-28 15:25 被阅读0次

    闭包:

    简单来说:

    闭包就是函数中的函数,就是说一个函数要访问另外一个目标函数内部的变量,就要在目标函数中再定义一个函数(以此来把作用域链往下延长一段,目的就是为了利用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闭包理解应用

          本文链接:https://www.haomeiwen.com/subject/lqnhuqtx.html