浅谈js闭包

什么是闭包?

闭包是指有权访另一个函数作用域中的变量的函数。
学过作用域我们就会知道,凡是函数内部的函数,都可以值执行的前一刻,拿到父级函数的AO对象,也就是父级作用域,而这样的现象会引发什么样的问题呢,我今天就来谈一下。

unction a (){
            var sum = 10;
            function b (){
                sum++;
                console.log(sum)
            }
            return b;
        }
        var c = test();
       for(var i =0;i<10;i++){
           c(); // 打印11到20
       }

c执行就是函数b执行,函数b拿到了函数a的变量sum,并且在函数a执行完成以后,没有销毁a函数作用域,由c函数一直保留下来,实现累加器功能。在这个过程中c函数访问到了a函数作用域里的变量,我们就称之为闭包。
这样的好处就是,js函数都是独立的,外界无法看到其内部的内容。但是运用闭包我们就可以访问到函数内部的变量了,同时因为作用域不会被销毁,变量可以一直保存在内存中。
这样是有缺点的,js本身具有垃圾收集机制:找出不再使用的变量,释放其占用的内存。但是在形成闭包时,由于外部函数的作用域一直被保存在内部函数的作用域链中,不能被释放,就会造成内存泄漏。所谓内存泄漏其实就是本来应该被回收的内存没有被释放,造成你内存空间的减小,存的东西少了,内存就像是泄漏了。
再看一段代码:

    var name = 'qxh';
    function a (){
        console.log(name);
    }
    function b(){
        var name = 'wkh';
        a();
    }
    b(); // 打印qxh

这里是没有闭包的所以打印的是qxh,闭包是指有权访另一个函数作用域中的变量的函数,我们知道但函数a在执行的前一刻定义时只能访问到全局的作用域,所以在执行的时候打印的是qxh。

入职不久的小前端从今以后开始自己的技术分享之旅,欢迎建议和批评。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章