最近艾伦在研究jQuery的sizzle选择器,和我分享了一个sizzle里边关于闭包的高级用法,说它高级,是因为它用的特别巧妙,代码我们都能看明白,但是不一定能想到要这样去用闭包。然后他得意地笑了,然后说道:”现在知道为什么我坚持要看源码了吧,这样的用法,看明白了,就是你的知识积累“。不得不承认,艾伦确实是一个比较肯钻研的人。sizzle里边的闭包用法,我已经记不清了,但是那个思路我还是记下来,后面会附上自己理解后的模拟代码。
code 1:
function createClure(){ return function cache(key,value){ return cache[key] = value; } } var bob = createClure(); // 传两个参数时,进行赋值 value = bob(‘para‘,‘test‘); // 传一个值时,进行取值 value = bob[‘para‘]
code 2 :
(function(){ var cache = []; var rubbit = ‘music‘; function(){ //这里可以直接引用前面的cache cahce.push(‘hash‘); rubbit += ‘enjoying‘; } })() //常规的用法 var fun = function(){ return function(cahe,rubbit){ cahce.push(‘hash‘); rubbit += ‘enjoying‘; } }; //待执行的函数 var fun2 = fun(); //需要传递的参数 var cache = [111,222]; var rubbit = ‘white‘; //执行调用 fun2(cache,rubbit);
相比起常用法,前面的闭包,可以直接取到需要变量,省了一些中间传递的过程,使的代码更优雅。当然,还有一个重要的好处,就是减少回调函数,只不过我这里的代码没有体现这一点。这些感受,也许你看了还不是很明白,不要紧,全当做是一个提醒好了。如果你在今后的项目中用到有很深的回调,以及零乱的调用关系的时候,能够想到这里,有一种灵光闪现的感觉,我就觉得很欣慰了。
原文地址:http://www.cnblogs.com/afrog/p/3861747.html