论坛首页 Web前端技术论坛

闭包应用(收集中....)

浏览 2133 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-27   最后修改:2009-03-27

闭包可以用优雅的方式来处理一些棘手的问题,有些程序员声称没有闭包简直就活不下去了。这虽然有些夸张,却从侧面说明闭包有着强大的功能。下面列举了一些闭包应用。

1、通过闭包修正事件注册时的this指针

button1.onclick =(function(owner){returnfunction({button1_click.apply(owner,arguments)}})(button1); 
  <!---->

2、利用闭包加强模块化

闭包有益于模块化编程,它能以简单的方式开发较小的模块,从而提高开发速度和程序的可复用性。和没有使用闭包的程序相比,使用闭包可将模块划分得更 小。比 如我们要计算一个数组中所有数字的和,这只需要循环遍历数组,把遍历到的数字加起来就行了。如果现在要计算所有元素的积呢?要打印所有的元素呢?解决这些 问题都要对数组进行遍历,如果是在不支持闭包的语言中,我们不得不一次又一次重复地写循环语句。而这在支持闭包的语言中是不必要的.


var sum=0;
function each(array,callback){
    var i=0,length=array.length;
    for(var v=array[0];i<length;i++){
        v=array[i];
        callback.call(v,i,v);
     }
     return array;
}
each(n,function(i,o){
     sum=sum+o;    
});
each(n,function(i,o)){
    sum=sum*o;
}
  <!---->

 

3、抽象,闭包是数据和行为的组合,这使得闭包具有较好抽象能力,下面的代码通过闭包来模拟面向对象编程的单例模式。

<!---->
MyNamespace.Singleton=(function(){
    //private methods
    var privateAttribute1=false;
    var privateAttribute2=true;
    function privateMethod(){
        
    }
    return {//public members
        publicAttribute1:true,
        publicAttribute2:10,
        method1:function(){
            
        },
        method12:function(){
            
        }
    }
})();
 

 

大家还有什么新的应用,可以分享下

   发表时间:2009-03-27   最后修改:2009-03-27
项目中用的不多
正好学习一下,
0 请登录后投票
   发表时间:2009-03-27  
话说对数组内容求和或者求积的操作,惯用法不是用each(或者在其它语言里,iter),而是用左折叠吧(foldl、fold_left),或者左规约(reduce、reduce_left、reducel)之类。
JavaScript版的例子在Mozilla上有,楼主看看这个:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce。底下有这样的例子:
var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
// total == 6


可以嵌套定义函数是很强有力的功能,不过使用的时候还是该养成不随便捕获不必要的变量的习惯。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics