jQuery学习笔记三:闭包

来源:互联网 发布:美工组是干什么的 编辑:程序博客网 时间:2024/06/03 17:30
       既然说到在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=1At Sun Apr 07 2013 14:18:28 GMT+0800 (中国标准时间) local=2At Sun Apr 07 2013 14:18:31 GMT+0800 (中国标准时间) local=3At Sun Apr 07 2013 14:18:34 GMT+0800 (中国标准时间) local=4At Sun Apr 07 2013 14:18:37 GMT+0800 (中国标准时间) local=5At Sun Apr 07 2013 14:18:40 GMT+0800 (中国标准时间) local=6


 

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

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

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

原创粉丝点击