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编辑  收藏  举报

导航