js的闭包和单例

离散数学中闭包的概念:若在一个集合上进行某种运算,其运算结果仍为集合中的元素,则称该集合为此运算上的闭包。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就不会被删掉。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值