问题描述
最近在学习《JavaScript高级程序设计》,其中关于闭包的两个例子,我照着书中的例子运行时,浏览器不打印也不报错,由于我是初学,才疏学浅,发现似乎是createFunctions()的循环不太对,但也没有调试成功,现在贴出来,还望大家共同讨论,各抒己见。 下面我把两个例子贴出来,希望有兴趣的朋友能够回复,看看是什么原因造成的: 例子1: <html><head><title>对象</title></head><script type="text/javascript">function createFunctions(){ var result = new Array(); for(var i=0;i<10;i++){ result[i] = function(){ return i; }; } return result;}var funcs = createFunctions();//分别输出0、1、2……9for(var i=0;i<funcs.lenght;i++){ document.write(funcs[i]() + "<br/>"); }</script><body></body></html>例子2: <html><head><title>对象</title></head><script type="text/javascript">function createFunctions(){ var result = new Array(); for(var i=0;i<10;i++){ result[i] = function(num){ return function(){ return num; }; }(i); } return result;}var funcs = createFunctions();//分别输出0、1、2……9for(var i=0;i<funcs.lenght;i++){ document.write(funcs[i]() + "<br/>");}</script><body></body></html> 另外,我对闭包的概念理解得也不透彻,不太明白闭包的定义:“闭包是指有权访问另一个函数作用域中的变量的函数:,那么在什么情况下使用闭包呢? 还有匿名函数的销毁,有一个疑问:匿名函数用完后,必须置为null吗?是因为闭包对活动对象的引用造成的吗? 期待同仁赐教,不胜感激。
解决方案
例子1中for(var i=0;i<funcs.lenght;i++){ document.write(funcs[i]() + "<br/>"); } 应该为:for(var i=0;i<funcs.length;i++){ document.write(funcs[i]() + "<br/>"); } length是数组的长度,lenght不知道是什么。这个结果应该输出十个换行的10;例2的错误一样应该输入1、2、3...楼主注意length的拼写就可以了。最后两个问题:1. 需要的时候在使用闭包,并不是用闭包就好,这个和设计模式一样;2. 理论上不需要,高级这本书有提到过。
解决方案二:
关于js 的函数和对象实现,javascript 高级编程讲的没有重点。推荐: Pro.JavaScript.with.MooTools 前1,2 章,对这些基础的东西讲的很透彻。例子也很多。