js之闭包

这种东西网上一大堆,我也就不写了,随便写写思想,回忆一下吧。

定义:闭包就是能够读取其他函数内部变量的函数。最常见的方式就是在一个函数内部创建另一个函数,这是因为内部函数能够访问到包含它的函数内的变量,因此它就是一个闭包;
首先理解清楚定义,不要理解定义的时候老跟用法混淆,这样的话很难理解清楚的;
当内部函数在定义它的作用域的外部被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们.
有个误区:
还是被误导了,之前想的,既然函数都调用完了,就回收了呗,哪还有什么变量保存呢,其实return 里面函数的时候并没有执行,只是在window环境下声明了而已,所以这个变量就不可以回收掉了;
而它调用的父函数中的变量也并不可以在window中使用,只是在那个声明的内部函数中使用而已;
函数执行完就销毁了,jQuery可以用是因为外面的window.jQuery = jQuery对象了,因此它不会销毁;
闭包所模拟的全局变量也只是需要调用函数罢了;不调用一样不能用啊

作用:
可以保护这个变量,用作缓存或是计数等,
因为当每次调用这个函数时,会清空它里面的变量的值,这么保存的话,这个变量不会清空,这回不断递增;而其他的函数什么的都碰不到这个变量,最简单的:可以查询调用了几次这个内部函数;

举个例子,最近正好看jquery的源码呢,看到这么一段,真是用闭包用的出神入化呀;
是Sizzle中用到的缓存片段,通过使用闭包函数来存放这三个缓存;

    classCache = createCache(),
    tokenCache = createCache(),
    compilerCache = createCache(),
function createCache() {
    var keys = [];

    function cache( key, value ) {
        // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
        if ( keys.push( key + " " ) > Expr.cacheLength ) {
            // Only keep the most recent entries
            //把第一个删除掉,并返回第一个的值
            delete cache[ keys.shift() ];
        }
        //把这个cache与函数cache混淆了,其实就是一个,只是函数也是对象,这样只是给cache函数加个属性而已,跟cache.key1=value1一样
        return (cache[ key + " " ] = value);
    }
    return cache;
}   

正常的大家肯定可以理解,var classCache = createCache(),这样就返回了一个函数,然后函数中存放着keys的变量值,每次调用classCache时,因此闭包特性,keys已经存在缓存中,并不会清空或消失,这样我们就轻松实现了缓存;

但是,当

    classCache = createCache(),
    tokenCache = createCache(),
    compilerCache = createCache(),

调用三次的时候不知道大家理解吗,我刚开始是懵逼了,瞬间感觉什么鬼,理解不了;
首先我先要请大家明白一点儿,函数加括号时等于就是执行该函数了,所以当赋予给变量时,它得到的只是返回值,跟函数其它的东西也就没有什么关系了,但是不加括号赋予某个变量时,等于就是这个函数本身,而非只有返回值,虽然关系不大哦;
好了,说正题,这三个函数调用的都是createCache,有些人可能就想了,这下都是执行这个函数了,不说返回函数的事,单说变量keys是不是一遍遍的清空,然后最后只剩一个了,我刚开始也有此想法,觉得函数不也是返回到全局变量中去了么,是不是就剩一个返回函数了,这样又如何能实现三个缓冲区呢,想了一上午,查阅各种资料,终于明白了,每次调用createCache函数时都会创建一个缓冲区给返回值,当返回值是一个函数时,就是创建多个缓冲区;当返回值只是一个值类型时,就不必开辟缓存空间了,这样是不是就清晰多了;他们虽然同名同姓,但是身处在不同的缓冲区内,都有它们赋予的变量通过引用地址去寻找它们,这样就不会冲突了;

参考:http://www.jb51.net/article/24101.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值