闭包的概念
我的理解是:闭包就是能够从外部读取函数内部变量的函数。函数形式是由外部函数和内部函数组成,内部函数使用着外部函数的变量,把内部函数直接返回给外部。
闭包的写法
- 直接获取结果
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
参考:银时老师