WEB开发网
开发学院网页设计JavaScript JavaScript\ActionScript\ruby\php中实现回调函数... 阅读

JavaScript\ActionScript\ruby\php中实现回调函数,以及由此引出的闭包问题的讨论(一)

 2009-09-25 00:00:00 来源:WEB开发网   
核心提示: 注意,我们改动了一个小小的地方,首先,我们在每次循环外边嵌套了一个匿名函数,之后,我们在这个函数外边加了一个括号,后面跟了一个括号,这是什么意思呢?其实就是我们在每次循环外边嵌套了一个函数,然后立即执行了这个函数,立即执行函数就是为了创建一个闭包,因为闭包只有在函数执行的时候才会创建.而嵌套函数

注意,我们改动了一个小小的地方,首先,我们在每次循环外边嵌套了一个匿名函数,之后,我们在这个函数外边加了一个括号,后面跟了一个括号,这是什么意思呢?其实就是我们在每次循环外边嵌套了一个函数,然后立即执行了这个函数,立即执行函数就是为了创建一个闭包,因为闭包只有在函数执行的时候才会创建.而嵌套函数也是为了创建一个嵌套闭包, 因为闭包只有在函数嵌套的时候才会体现出它的威力,按照上述的方法定义函数,我们实际上定义了i个顶层函数,然后我们在移动鼠标的时候,就会调用相应函数的内嵌函数,我们为每个内嵌函数保存了一个i值,通过这个值我们获取到得才是真正的对应的i值,执行结果如下:

JavaScript\ActionScript\ruby\php中实现回调函数,以及由此引出的闭包问题的讨论(一)

至此,闭包就讲到这里了,其实闭包并不是一个完美的东西,因为它会给你保存所有的引用,如果你不手动回收这些引用,那么会有可能造成内存泄露,例如在ie 中,如果每秒创建1000个dom元素,并为每个dom元素绑定一个点击事件,然后移除之前创建的1000个dom元素的话,那么不幸的告诉你,你并不能回收之前的1000个元素,所以内存使用会疯长直至内存泄露,这是因为ie的工作机制造成的,ie无法自动识别创建的闭包,然后解除这种引用关系,而是一直保持这种引用关系,当然在其他浏览器中并不存在这种问题,因为他们会自动识别这种无用的闭包,并回收之,而在ie中要先手动解除这些引用,也就是移除所有的dom元素的事件绑定.

文章来源:http://www.cnblogs.com/mars-bird/archive/2009/09/24/1572972.html

上一页  1 2 3 4 5 

Tags:JavaScript ActionScript ruby

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接