javascript闭包的应用简单代码实例

快乐打工仔 分类:实例代码

关于闭包的概念可以参阅闭包概念简单解析一章节。

先看一段代码实例:

<!DOCTYPE html>
<html> 
<head> 
<meta charset=" utf-8"> 
<meta name="author" content="http://www.pipipi.net/" /> 
<title>前端教程网</title> 
<style type="text/css"> 
ul li{ 
  font-size:12px; 
  list-style:none;
  cursor:pointer;
  height:30px;
} 
</style> 
<script type="text/javascript">
window.onload=function(){
  var lis=document.getElementsByTagName("li");
  var odiv=document.getElementById("show");
  for(var index=0;index<lis.length;index++){
    lis[index].onclick=function(){
      odiv.innerHTML=index;
    }
  }
}
</script> 
</head>  
<body> 
<div id="show"></div> 
<ul id="box"> 
  <li>只有努力奋斗才会有美好的未来。</li> 
  <li>前端教程网欢迎您,希望能够给大家提供需要的知识。</li> 
  <li>分享的精神和互助的胸怀是进步的最大源动力。</li> 
  <li>只有当前的时间才是最真实的,下一秒都是虚幻的。</li> 
  <li>每一天都是新的,要好好的珍惜。</li> 
</ul> 
</body> 
</html>

上面的代码我们的本意是点击li元素能够显示对应的索引。

出现这种状况的原因是,当事件处理函数绑定完毕之后,index的值也就变成了5了。

代码修改如下:

<!DOCTYPE html>
<html> 
<head> 
<meta charset=" utf-8"> 
<meta name="author" content="http://www.pipipi.net/" /> 
<title>前端教程网</title> 
<style type="text/css"> 
ul li{ 
  font-size:12px; 
  list-style:none;
  cursor:pointer;
  height:30px;
} 
</style> 
<script type="text/javascript">
window.onload=function(){
  var lis=document.getElementsByTagName("li");
  var odiv=document.getElementById("show");
  for(var index=0;index<lis.length;index++){
    (function(index){
      lis[index].onclick = function(){
        odiv.innerHTML=index;
      }
    })(index);
  }
}
</script> 
</head>  
<body> 
<div id="show"></div> 
<ul id="box"> 
  <li>只有努力奋斗才会有美好的未来。</li> 
  <li>前端教程网欢迎您,希望能够给大家提供需要的知识。</li> 
  <li>分享的精神和互助的胸怀是进步的最大源动力。</li> 
  <li>只有当前的时间才是最真实的,下一秒都是虚幻的。</li> 
  <li>每一天都是新的,要好好的珍惜。</li> 
</ul> 
</body> 
</html>

上面的代码实现了我们的要求,下面做一下简单介绍。

此代码是将函数当返回值,通过自执行函数的参数,把变量index传进去(因为是通过函数参数的方式传递,所以内部的index与外部的index就已经隔绝),然后因为返回函数要引用这个index变量,所以当for循环结束也不会释放index变量。即在内存中保存了index变量的值。

javascript闭包的应用简单代码实例,这样的场景在实际项目中还是用的比较多的,关于javascript闭包的应用简单代码实例就介绍到这了。

javascript闭包的应用简单代码实例属于前端实例代码,有关更多实例代码大家可以查看

回复

我来回复
  • 暂无回复内容