码迷,mamicode.com
首页 > 编程语言 > 详细

4、JavaScript高级之闭包

时间:2015-03-01 17:11:20      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:javascript   高级   闭包   

一、什么是闭包

距离上一次更新有一段时间了,过年你懂得,接下来就谈谈JavaScript的高级用法——闭包。js的闭包其实不是什么难懂的高深的概念,只是有些书籍当中介绍的不够易懂或者说举得例子不太恰当,现在我们就通过简单的例子来理解“闭包”。作为程序员,也许一段针对的代码,比那些文字描述更能说明问题,用代码说话,眼见为实。

好了,先看下面的一段代码:

   function t1(){
        var age = 20;
         function t2(){
            alert(age);
        }
        return t2;
    }
    var age = 100;
    var temp = t1();
    temp();//20

为了突出 执行效果,在t1函数外层也定义了一个age=100的变量,执行完 var temp = t1(); 后,将函数t2赋予了temp,这样temp其实就是t2函数的引用,紧接着执行temp,输出结果竟然是20,毫无疑问,变量age是在t1函数的作用域下的,你已经看到JavaScript语言与其他语言不同的地方。

在大部分语言中,如java,函数t1内的局部变量会随着函数t1执行结束而销毁,但是在js中,变量age=20却被t2捕抓,即使是t1函数执行结束后,依然可以通过t2访问到age
  这种情况,即返回的t2函数不是孤立的,甚至把周围的变量环境,形成了一个‘封闭包’,一起返回,所以叫‘闭包’


二、闭包的应用

JavaScript既然有闭包的实现,那么JavaScript的闭包是怎么使用的或应用在哪种情况下呢?通过上面的例子已经看到,函数t1内部的age变量只能通过返回的t2函数访问,那么age是不是相当于java的private私有变量呢,哈哈,这个在下一篇会讲到,而且将通过“闭包”将属性封装在内部,做成接口,别人也就看不见,也不会污染到其他的变量,想想是不是呢。

讲那么多,我们就通过一个实际的例子看看:

要求:实现一个计数器,每次调用某函数,使计时器的值加1

1、闭包实现

   function counter(){
        var i = 0;//但counter执行完毕后,除了返回的inc函数,其他函数访问不了变量i
        var inc = function(){
            return ++i;
        }
        return inc;
    }
    var c = counter();
    alert(c());
    alert(c());
    alert(c());
2、可以结合“匿名”函数,进行简化

   var counter = (function(){
        var i = 0;
        return function(){
            return ++i;
        }
    })();
    alert(counter());
    alert(counter());
    alert(counter());
相信你已经看到了闭包的好处,但是请不到胡乱使用闭包,因为在IE浏览器下是使用“计数”的方式跟踪对象来进行垃圾回收的,由于闭包的特新,不会释放局部变量,如果造成过多的循环引用,将会引起“内存泄露”。


4、JavaScript高级之闭包

标签:javascript   高级   闭包   

原文地址:http://blog.csdn.net/guixuecheng/article/details/44002753

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!