javaScript 权威指南读书笔记(闭包)
关于闭包的经典题目:
#1 针对以下html代码片段,编写javascript实现点击li时弹出其索引。
<ul> <li>This is the First one</li> <li>This is the Second one</li> <li>This is the Third one</li> </ul>
此文讲的是闭包,当然是用闭包来做,但是还是比较容易犯错,因为搞不清闭包的关系,下面把我自己写的糊涂代码贴出来。
var liCollection=document.getElementsByTagName("li"); function alertIndex(idx){ return function(){ alert(idx);} } for(var i=0;i<liCollection.length;i++){ liCollection[i].onclick=function(){ alertIndex(i)(); }; }
这样并不能弹出相对应的index,原因是当点击li时要执行的函数和外层的for循环里面的i并未构成闭包。错在没有搞清利用闭包存储哪些变量,这里因为onclick的函数阻断了外层for循环i的闭包。
正解如下:
var liCollection=document.getElementsByTagName("li"); function alertIndex(idx){ return function(){ alert(idx);} } for(var i=0;i<liCollection.length;i++){ liCollection[i].onclick=alertIndex(i); }
#2 补全以下缺失的代码
var a=1; .... alert(a); alert(a);
Solution1
var a=1; a={ num:1, toString:function(){ return num++; } } alert(a); alert(a);
Solution2
var a={ toString:(function(){ var n=1; return function(){return n++;}; })() }; alert(a); alert(a);
同一个外部函数内定义的私有变量,可以被嵌套在该函数内的多个函数访问。这样就可以通过多个嵌套函数实现对私有变量值的不同操作。
eg.
function counter(){ var n=0; return { count:function(){ n++; }, resetN:function(){ n=0; }, getN:function(){ return n; } } } var c1=counter(); c1.count(); console.log(c1.getN()); c1.reset(); console.log(c1.getN());
posted on 2014-02-12 10:07 Young_Junior_Man 阅读(144) 评论(0) 编辑 收藏 举报