javascript 闭包小结
2012-03-19 20:46
375 查看
<html> <head> <style> .test { width:100px; height:100px; border:red 1px solid; } </style> </head> <body> <div class="test"></div> <div class="test"></div> <div class="test"></div> </body> </html> <script type="text/javascript"> var k = document.getElementsByTagName("div"); var k = document.getElementsByTagName("div"); for(var i = 0; i < k.length; i++) { (function(i){ k[i].onclick = function() { alert(i); } })(i); //makeSizer(12); makeSizer(size){return function(){}} } </script>
点击div 元素,会依次 弹出 0,1,2
经过for循环,内存已经存在三个匿名函数的对象,k[i].onclick 的 i 用了 (function(i) 。。。)(i) 中传入的i, 即0,1,2。下边有详细的解释,对于局部变量在内存中的存在。
再贴出一段代码:
function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
感谢:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
如果非要指向object,可显式的控制--把代码的最后一句改为 alert(object.getName().call(object));函数内部定义的方法和变量,要等到函数执行过以后,才会真正定义,没加 var ,就是全局变量
相关文章推荐
- Javascript闭包演示代码小结
- 简单小结一下关于JavaScript中的闭包
- javascript 闭包小结
- JavaScript 闭包小结
- javascript中闭包的原理与用法小结(转)
- Javascript闭包演示代码小结
- JavaScript 匿名函数、模块模式、闭包、命名空间、创建构造器(类)、继承
- Javascript中获取对象的原型对象的方法小结
- 全面理解Javascript闭包和闭包的几种写法及用途
- javascript 匿名函数和闭包
- 转:全面理解Javascript闭包和闭包的几种写法及用途
- javascript深入理解js闭包
- 2 - javascript原型和闭包( 函数和对象的关系)
- JavaScript利用闭包实现模块化
- JavaScript 闭包在封装函数时的简单分析
- javascript,jquery闭包概念分析
- 写给想学习Javascript的朋友一点学习经验小结
- JavaScript的模块化:封装(闭包),继承(原型) 介绍
- JavaScript中常用的运算符小结
- 在Html中使用JavaScript的几点小结