闭包,接触js的确定不会陌生,学习的一番,有以下理解:java
一 .怎样理解ruby
百科上的解释是,闭包指的是能够访问自由变量的代码块,这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量);闭包
我是这么理解的,一段代码块的运行,看得见的是代码,是敲出的字符,看不见的是运行时的环境和上下文,运行时的环境本质也是一组变量,代码块运行的时候,能够调用自身定义的局部变量,还能够根据定义时得绑定访问外部定义的数据,就是闭包。不严谨的归纳一下,只要访问了外部定义的数据的代码块,就是闭包!dom
二.代码举例函数
function fA(x){学习
var temp = 2;设计
return function(y){对象
alert(y+x+temp);get
} io
}
var fB = fA(3);
fB(4); --这就是一个闭包 ,它访问了temp,x这些不是自身定义的变量或参数,这些基本类型数据之间都是值传递
var arg = new Number(2);
var fB = fA(arg);
fB(4);--当传递的变量或参数是Object,数据传递则是引用传递,对arg的任何操做都是指向最初一个对象
js中调用延迟函数,其实不知不觉中也是在使用闭包特性,
function replace(domId,text,time){
setTimeout(function(){
document.getElementById(domId).innerHTML = text;
},time)
}
三.还用什么用
上面举例几种闭包在js中的例子,代表其实咱们在不了解闭包的状况下,也常常使用闭包特性,接下来举一个不经常使用的例子,隐藏函数的中数据,这个搞过java的人都知道get/set这种pojo中的写法,类的属性对外隐藏,提供统一的对外访问修改的方法,用闭包也能够实现
var pojo = (function {
var arr = {};
return function (key,val){
if(val=== undefined) return arr[val];
else{
date[key] = val;
return date[key];
}
}
}){};
pojo('a');//undefined
pojo('a',1);//set 1
pojo('a');//get 1
四.一些思考
目前,不光js,在java7,C#,ruby中都加入了闭包的特性,C#中闭包经过委托来实现大写基础,随后发展出简洁优雅的lambda表达式和LINQ,是的用C#写代码莫名的感受爽,无论存在于哪,闭包经过突破通常函数的调用限制,让咱们在不知不觉中写出更优雅的代码。以前在一位博主上看到,一段这样归纳闭包的话,深觉得然,其实不光是闭包,一些能普遍被接收语言特性,都是和闭包同样有相似特色:
(1)闭包是一种设计原则,它经过分析上下文,来简化用户的调用,让用户在不知晓的状况下,达到他的目的;
(2)网上主流的对闭包剖析的文章其实是和闭包原则反向而驰的,若是须要知道闭包细节才能用好的话,这个闭包是设计失败的;
(3)尽可能少学习。
over。