javascript 闭包的学习

闭包的学习 

1.什么是闭包?

2.闭包有什么好处?应用在那里?

3.闭包需要注意得地方?

这是我学习javascript 闭包的方向:

闭包的定义:函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回,什么意思?好抽象哦

function a(){   // 先定义一个函数
   var i=1;
   function b(){
    alert(i);  // 这里弹出的是1;没错就是1,这里正应证了函数嵌套函数,内部函数可以引用外部函数的参数和变量
  }
   return b();
} a();
//执行函数

 

这里我再说一下js垃圾回收机制

function aaa(){
    var a = 1;
    a++;
    alert(a);
}
aaa(); //这里执行的时候弹出的2;

 

aaa();在执行一次的时候弹出的还是2;  为什么呢,哈哈,这里就涉及js 的垃圾回收机制,var a=1;是局部变量,没有被引用,一旦aaa()执行后会销毁 a变量;在执行时又

重新创建var a=1;所以两次都是弹出的是2;那怎样才不会销毁呢,想一直累加?

var a = 1;//定义一个全局变量
function aaa(){
      a++;
     alert(a);
}
aaa();  // 弹出是2
aaa();//弹出的是3

 

这里的a 没有被销毁,a是一个全局变量,所以一直引用,这就是js的垃圾回收机制,可是我想在内部一直累加行不行呢

可以的。。。。。

 

function a(){
   var a=1;
   function b(){
      a++;
      alert(a);
  }
  return b;
}
var c=a();
c(); //2
c(); //3

 

//为什么会是3呢,这里就涉及js的垃圾回收机制

function b(){
  a++;
  alert(a)
}  // 这里的a 一直引用着,并没有销毁a 变量,所以才会累加

好处:

1.希望一个变量长期驻扎在内存当中

2.避免全局变量的污染

3.私有成员的存在

用法:

1.模块化代码
2.在循环中直接找到对应元素的索引

var a = 1;
function aaa(){
    a++;
    alert(a);
}

aaa(); //2
aaa(); //3
function aaa(){
    var a = 1;
    a++;
    alert(a);
}
aaa(); //2
aaa(); //2
alert(a); ===>a is not defined
function aaa(){
    var a = 1;
    return function(){
        a++;
        alert(a);
    }
}
var b = aaa();
b(); //2
b(); //3
alert(a); ===>a is not defined
var aaa = (function(){
  var a = 1;
  return function(){
    a++;
    alert(a);
  }
})();
aaa(); //2
aaa(); //3

var aaa = function(){
  var a = 1;
function bbb(){
    a++;
    alert(a);
  }
  function ccc(){
    a++;
    alert(a);
  }
  return {
    b : bbb,
    c : ccc
  }
}();
aaa.b(); //2
aaa.c(); //3

alert(a); // 这里访问不到的 ====>a is not defined alert(bbb);// 这里访问不到的 ====>bbb is not defined alert(ccc);//这里是访问不到的 ====>ccc is not defined
function aaa(){
  alert(1);
}
aaa();
(function(){
  alert(1);
})();

 

 

这里怎样才点击的到li 的下标呢

<script>
window.onload = function(){
var aLi = document.getElementsByTagName('li');

for(var i=0;i<aLi.length;i++){
  (function(i){//这里是传递参数
     aLi[i].onclick = function(){
        alert(i);
     };
    })(i);//这里的 i 作为参数传人
}
</script>


<script>
window.onload = function(){
var aLi = document.getElementsByTagName('li');

for
(var i=0;i<aLi.length;i++){  aLi[i].onclick = (function(i){    return function(){     alert(i);
  }   })(i);   }
};
</script>
 
<ul>
  <li>11111111111</li>
  <li>11111111111</li>
  <li>11111111111</li>
</ul>

如有错误,请留言

 

posted @ 2016-07-24 23:22  jifengdehao  阅读(187)  评论(0编辑  收藏  举报