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的值
  • 封装,私有化属性
unction 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");  
  • 实现类和继承
function Person(){    
    var name = "default";       
       
    return {    
       getName : function(){    
           return name;    
       },    
       setName : function(newName){    
           name = newName;    
       }    
    }    
    };   

    var p = new Person();
    p.setName("Tom");
    alert(p.getName());

    var Jack = function(){};
    //继承自Person
    Jack.prototype = new Person();
    //添加私有方法
    Jack.prototype.Say = function(){
        alert("Hello,my name is Jack");
    };
    var j = new Jack();
    j.setName("Jack");
    j.Say();
    alert(j.getName());

 

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

参考:银时老师

 

posted @ 2018-12-05 15:40  加菲ZYK  阅读(94)  评论(0)    收藏  举报