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
参考:银时老师

浙公网安备 33010602011771号