作者:风暴工会 | 来源:互联网 | 2023-01-28 18:47
离散数学中闭包的概念:若在一个集合上进行某种运算,其运算结果仍为集合中的元素,则称该集合为此运算上的闭包。X运算闭包集合中元素X运算后还是X元素“闭包”一词来源于以下两者的结合:要执行的
离散数学中闭包的概念:若在一个集合上进行某种运算,其运算结果仍为集合中的元素,则称该集合为此运算上的闭包。X运算闭包=集合中元素X运算后还是X元素
“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境 (作用域)。闭包=为该函数(对象)的使用提供计算域+函数(对象)
因此,有了闭包特性之后,才能在一个函数中调用另一个函数,而且另一个函数可以引用外部变量。
1、定义:在一些语言中,在函数中定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。可以在函数内部定义函数,而且该函数可以引用外部变量。
在C中不存在早已经设定好的闭包功能。只能设定一个堆和栈的数据结构来保存函数的数据和函数的指针。否则的话,该函数不能返回在函数内部定义的函数值。(C本来就不能在函数内部定义函数。)
而C++,Java,JS(函数也是对象)这些语言可以。
2、实例:
Java实现:
堆内存和栈内存。一个保存对象,一个保存引用。并且使用垃圾回收期保证堆内存不会充斥垃圾。如:android中可以在函数中定义监听器。
C++:
没有垃圾回收器,因此需要程序员自己delete才能够释放相应的内存。C11后的标准支持闭包。原来C++要这样做,需要使用指针进行。否则的话,函数中的函数只能有复制,而不能修改原数据。传值调用还是传址调用。
JS:
1、代码需要在setTimeout()里延时执行;
setTimeout(function(){out.value += i + '\n';alert(i);}, 100);
在settimeout函数结束后,内部的funtion依然存在,因为在内存中依然存在,只是新建的引用已经消失了。
2、代码需要在ajax异步请求的回调函数中执行;
OnReadystateChange中,set完以后,该函数结束,但是该函数内部的函数依然可以继续运行。
3、实现:总而言之,闭包的实现是把引用和对象分开保存。
类是带行为的数据,闭包是带数据的行为。
JS中,单例模式可以通过一个独立的入口函数,提供共享资源,从而使其与全局变量(资源)隔离。利用闭包,某个对象创建时
http://blog.csdn.net/alexweixf/article/details/11093363
var single= (function(){
var unique;
function getInstance(){
if( unique=== undefined){
unique = new Construct();
}
return unique;
}
function Construct(){
// ... 生成单例的构造函数的代码
}
return{
getInstance : getInstance
}
})();
该函数返回的是一个对象,而这对象有getInstance方法,该方法是从闭包中找到getInstance的。因为有对其的引用,所以内存中会保留。unique就不会被删掉。