jQuery学习笔记三:闭包

       既然说到在JavaScript中函数作为“一等公民”而存在,那我们就不得不谈一下另一个高级的函数专题——闭包(closure)。

       很多语言都对闭包有不同程度的支持,像是RubyPython以及objective c。学过Java的应该知道,Java虽然没有显式支持闭包,但对于非静态内部类而言,它不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,因此可以吧非静态内部类当成面向对象领域的闭包。

       简单地说,闭包就是Function实例,外加对于Function实例的执行来说必需的、来自环境的本地变量。在声明函数时,可以在声明之处引用其作用域内的任何变量。甚至在声明之处已经超出作用域而关闭声明之后,这些变量仍为该函数所支持。

       看如下代码:

<head>
     <title>Closure</title>
     <scriptsrc="jquery.js"></script>
     <script>
         $(function(){
            varlocal=1;    //名为local的本地变量
            window.setInterval(    //建立3s触发一次的计时器
            function()
            {
               //将内容增加到div元素中
               $('#display').append('<div >At'+new Date()+ ' local='+local+'</div>');
               local++;               
            },
            3000);
         });
     </script>
     </head>
     <body>
       <divid="display"></div>
     </body>
</html>

 

 


 

 加载页面,一段时间后,我们看到页面内容为:

 

At Sun Apr 07 2013 14:18:25 GMT+0800 (中国标准时间) local=1

At Sun Apr 07 2013 14:18:28 GMT+0800 (中国标准时间) local=2

At Sun Apr 07 2013 14:18:31 GMT+0800 (中国标准时间) local=3

At Sun Apr 07 2013 14:18:34 GMT+0800 (中国标准时间) local=4

At Sun Apr 07 2013 14:18:37 GMT+0800 (中国标准时间) local=5

At Sun Apr 07 2013 14:18:40 GMT+0800 (中国标准时间) local=6


 

       我们可能认为,在回调函数(setInterval函数里的函数)执行期间,local的值应该是未定义的(因为local定义在回调函数之外,且回调函数在页面加载3秒内触发,也就是在就绪处理函数执行完毕很久才触发)。但是为什么出现了上面的页面内容呢?

       这就是我们所说的“闭包”。JavaScript里所有的闭包,被隐式地创建。当就需处理程序退出时,虽然local声明所在的块确实超出了作用域,但是函数声明所创建的闭包(包括local),在该函数的生命期内保持在作用域内。

       注意:无意的闭包可能带来意外的后果,例如,循环引用可以导致内存泄露。内存泄露的典型事例是创建向后引用闭包变量的DOM元素,组织了那些变量的回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值