JS中的闭包

什么是闭包

我对闭包的理解就是一个局部变量加上一个可以访问这个局部变量的函数的总和,就形成了一个闭包。在JS中由于函数作用域的原因,如果需要局部变量,那就要把它放进函数内部,而又因为只有子函数可以访问局部变量,所以闭包的形式通常是一个函数嵌套在另一个函数内部。
例如以下这种形式:

function foo(){
  var local = 1
  function bar(){
    local++
    return local
  }
  return bar
}

var func = foo()
func()  //2

在这里,local 变量和 bar 函数就组成了一个闭包(Closure)

闭包的作用

闭包常常用来访问局部变量,如果不用闭包,定义一个全局变量,那这个值很容易被别人修改,所以使用局部变量,但是别人又访问不了局部变量,所以要暴露一个访问器函数,外界只有通过这个访问器才能访问局部变量

var foo = (function() {
    var secret = 'secret';
    // “闭包”内的函数可以访问 secret 变量,而 secret 变量对于外部却是隐藏的
    return {
        get_secret: function() {
            // 通过定义的接口来访问 secret
            return secret;
        },
        new_secret: function(new_secret) {
            // 通过定义的接口来修改 secret
            secret = new_secret;
        }
    };
} ());

foo.get_secret(); // 得到 'secret'
foo.new_secret('a new secret'); // 通过函数接口,我们访问并修改了 secret 变量
foo.get_secret(); // 得到 'a new secret'

闭包的应用场景

闭包随处可见,一个Ajax请求的成功回调,一个事件绑定的回调方法,一个setTimeout的延时回调,或者一个函数内部返回另一个匿名函数,这些都是闭包

关于闭包的误解

许多人认为闭包会造成内存泄漏,其实并不会,这只是IE老版本浏览器的垃圾回收BUG,在闭包使用完之后,IE无法回收闭包内的变量,这是IE浏览器自身的问题,而不是闭包的问题。
内存泄漏指的是变量访问不到,又不会被回收,占据着内存空间,而闭包中的变量是我们可以访问并且可回收的,所以不要再冤枉它啦!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容