JavaScript 闭包

闭包的概念

我的理解是:闭包就是能够从外部读取函数内部变量的函数。函数形式是由外部函数和内部函数组成,内部函数使用着外部函数的变量,把内部函数直接返回给外部。

闭包的写法

  • 直接获取结果
function foo(c){
  var num = c;
  return function A(){
    num++;
    return num;
  }
}

var b = foo(5);
  • 绑定外部属性或者变量
function foo(){
    var ss = 123
    function A(){
        console.log(sss)
    }
    window.$ = A;//将foo作用域里面的A存储到全局window下的$中也是形成闭包。
}
foo();
  • 作为对象的属性方法
var Circle={  
   "PI":3.14159,  
   "area":function(r){  
     return this.PI * r * r;  
   }  
};  
alert( Circle.area(1.0) );

闭包的作用

  • 循环绑定
function foo(){
    var arr = [];
    for(var i = 0;i<10;i++){
        arr[i]=function(){
            return console.log(i)
        }
    }
    return arr
}
var mylist = foo();//mylist是一个存了10个函数的数组
//对数组每一个值执行的过程中就会出现意外情况,也可以用闭包来解决

function foo(){
    var arr = [];
    for(var i = 0;i < 10;i++){
        arr[i]=(function(j){
            return function(){
                console.log(j)
            }
        })(i)
    }
    return arr
}
var mylist = foo();//此时梳理出来mylist是一个数组,每个打印出来就是对应的i的值
  • 封装,私有化属性
function create(){
    var Gin = {
        "money": 100
    }
    console.log("你的钱是:"+Gin.money)
    return {
        "add":function(){
            Gin.money+=10;
            console.log("你的钱是:"+Gin.money);
        },
        "lost":function(){
            Gin.money-=5;
            console.log("你的钱是:"+Gin.money);
        },
        "get":function(){
            return Gin.money;
        }
    }
}
var yinshi = create();//"你的钱是:100"
yinshi.add();//"你的钱是:110"
yinshi.lost();//"你的钱是:105"
var yinshi2 = create();
yinshi2.get();//100
  • 结果缓存
var CachedSearchBox = (function(){    
    var cache = {},    
       count = [];    
    return {    
       attachSearchBox : function(dsid){    
           if(dsid in cache){//如果结果在缓存中    
              return cache[dsid];//直接返回缓存中的对象    
           }    
           var fsb = new uikit.webctrl.SearchBox(dsid);//新建    
           cache[dsid] = fsb;//更新缓存    
           if(count.length > 100){//保正缓存的大小<=100    
              delete cache[count.shift()];    
           }    
           return fsb;          
       },    
     
       clearSearchBox : function(dsid){    
           if(dsid in cache){    
              cache[dsid].clearSelection();      
           }    
       }    
    };    
})();    
     
CachedSearchBox.attachSearchBox("input"); 

参考:https://www.cnblogs.com/yunfeifei/p/4019504.html

参考:银时老师

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值