jQuery学习笔记三:闭包
来源:互联网 发布:美工组是干什么的 编辑:程序博客网 时间:2024/06/03 17:30
既然说到在JavaScript中函数作为“一等公民”而存在,那我们就不得不谈一下另一个高级的函数专题——闭包(closure)。
很多语言都对闭包有不同程度的支持,像是Ruby、Python以及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元素,组织了那些变量的回收。
- jQuery学习笔记三:闭包
- jQuery闭包学习笔记
- jQuery学习笔记2--闭包
- jquery学习笔记(三)
- jQuery学习笔记三
- JQuery学习笔记三
- python闭包学习笔记三
- gradle学习笔记(三) Groovy闭包
- 【JQuery学习笔记三】JQuery学习总结
- jQuery-$选择器 学习笔记三
- jQuery实战学习笔记 (三)
- Jquery学习笔记(三)
- jQuery Mobile 学习笔记三
- JQuery学习笔记(三)
- jQuery学习笔记(三)
- jQuery学习笔记(三)
- jQuery学习笔记之三
- jQuery学习笔记(三)
- django 加载静态文件
- Eclipse 问题:java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAn
- jsp:directive.page
- CSS详解(二)— —媒体查询(1)
- Oracle DDL SQL语句总结
- jQuery学习笔记三:闭包
- 严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.InvocationTargetE
- 浅析C++中的动态多维数组
- Python读写文件
- 一锅乱炖之C/C++
- innobackupex-1.5.1: Too many command line arguments
- Spring上下文Bean的生命周期
- hover的transition
- jquery省市二级联动插件