Jquery库与js中的闭包

当年在学js的时候就早早听闻过闭包的大名,怎奈那是才疏学浅,一直不能理解其中的精髓,这次在改造jQuery库的过程中,深深感到了js闭包的亮点。下面的例子能够很好的说明闭包的用途:代码如下:
Expr = Sizzle.selectors = {
match: matchExpr,
filter: {
“ID”: function( id ) {
var attrId = id;
return function( elem ) {
return elem.id == attrId;
},
“TAG”: function( nodeNameSelector ) {
var nodeName = nodeNameSelector;
return nodeNameSelector === “*” ?
function() { return true; } :
function( elem ) {
return elem.tagName && elem.tagName === nodeName;
};
},

    }

};
当我们调用jquery的filter函数的时候,比如$(“div”).filter(“#first”),我们需要在首先获得tag为div的元素,然后遍历每个元素,看每个元素的id是否和元素的div相同。
jQuery里面的代码逻辑实现起来大致是,用正则表达式确定filter里面的参数是什么选择器,确定是filter中的“ID”,还是“TAG”,确定以后就会返回一个函数代码,并赋值给一个全局变量matcher,然后调用matcher(elem),其中elem就是我们要筛选的elem,判断matcher(elem)返回的是true还是false,选择是否push进新的数组里面。在matcher函数中,变量attId 或者nodeName就是通过闭包的形式保留的。
刚开始使用这段代码时候,有疑惑这个attId和nodeName在函数调用完不会被销毁么?
和C,java不同,函数的参数不是通过压栈实现,而是为每个函数创建一个参数对象(高明),这个对象只要一直有引用就不会被js的GC机制回收。在闭包中,内部函数,一直被matcher 握着,所以内部函数不会被销毁,而内部函数又引用变量attId或者nodeName,所以这个attId和nodeName一直都会存在。一旦matcher被销毁了,attId或者nodeName才会被销毁。
总结起来,闭包就是内部函数引用包含父函数的变量,默默地内部函数多了一个变量值,不需要我们在调用这个函数的时候传进去,成为了一个固定常量。嗯,这么理解比较符合闭包的特色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值