浅谈JavaScript for循环 闭包

 更新时间:2016年06月22日 08:53:35   投稿:jingxian  
下面小编就为大家带来一篇浅谈JavaScript for循环 闭包。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。

<html >   
<head>   
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   
<title>闭包演示</title>   
<script type="text/javascript">   
  
function init() {   
  var pAry = document.getElementsByTagName("p");   
  for( var i=0; i<pAry.length; i++ ) {   
     pAry[i].onclick = function() {   
     alert(i);   
  }   
 }   
}   
</script>   
</head>   
<body onload="init();">   
<p>产品一</p>   
<p>产品二</p>   
<p>产品三</p>   
<p>产品四</p>   
<p>产品五</p>   
</body>   
</html>  

解决方式有以下几种

1、将变量 i 保存给在每个段落对象(p)上

function init() {   
 var pAry = document.getElementsByTagName("p");   
 for( var i=0; i<pAry.length; i++ ) {   
   pAry[i].i = i;   
   pAry[i].onclick = function() {   
    alert(this.i);   
   }   
 }   
}   

2、将变量 i 保存在匿名函数自身

function init2() {   
 var pAry = document.getElementsByTagName("p");   
 for( var i=0; i<pAry.length; i++ ) {    
  (pAry[i].onclick = function() {   
    alert(arguments.callee.i);   
  }).i = i;   
 }   
} 

3、加一层闭包,i以函数参数形式传递给内层函数

function init3() {   
 var pAry = document.getElementsByTagName("p");   
 for( var i=0; i<pAry.length; i++ ) {   
  (function(arg){     
    pAry[i].onclick = function() {     
     alert(arg);   
    };   
  })(i);//调用时参数   
 }   
}   

4、加一层闭包,i以局部变量形式传递给内存函数

function init4() {   
 var pAry = document.getElementsByTagName("p");   
 for( var i=0; i<pAry.length; i++ ) {    
  (function () {   
   var temp = i;//调用时局部变量   
   pAry[i].onclick = function() {    
    alert(temp);    
   }   
  })();   
 }   
}   

5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

function init5() {   
 var pAry = document.getElementsByTagName("p");   
 for( var i=0; i<pAry.length; i++ ) {    
  pAry[i].onclick = function(arg) {   
    return function() {//返回一个函数   
    alert(arg);   
   }   
  }(i);   
 }   
}  

6、用Function实现,实际上每产生一个函数实例就会产生一个闭包

function init6() {   
  var pAry = document.getElementsByTagName("p");   
  for( var i=0; i<pAry.length; i++ ) {    
   pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例  
  }   
}  

7、用Function实现,注意与6的区别

function init7() {   
  var pAry = document.getElementsByTagName("p");   
  for( var i=0; i<pAry.length; i++ ) {   
     pAry[i].onclick = Function('alert('+i+')')  
  }   
}  

以上就是小编为大家带来的浅谈JavaScript for循环 闭包全部内容了,希望大家多多支持脚本之家~

相关文章

  • AjaxUpLoad.js实现文件上传功能

    AjaxUpLoad.js实现文件上传功能

    这篇文章主要为大家详细介绍了AjaxUpLoad.js实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • JavaScript中对于SPA单页面的理解

    JavaScript中对于SPA单页面的理解

    这篇文章主要介绍了JavaScript中对于SPA单页面的理解,单页应用SPA是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互
    2023-02-02
  • 深入理解JS继承和原型链的问题

    深入理解JS继承和原型链的问题

    js原型链与继承是js中的重点,原型的实现则是在原型链的基础上,本篇文章深入理解JS继承和原型链的问题,有兴趣的同学可以了解一下。
    2016-12-12
  • JavaScript控制table某列不显示的方法

    JavaScript控制table某列不显示的方法

    这篇文章主要介绍了JavaScript控制table某列不显示的方法,涉及javascript操作表单的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • 解决Layui数据表格显示无数据提示的问题

    解决Layui数据表格显示无数据提示的问题

    今天小编就为大家分享一篇解决Layui数据表格显示无数据提示的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 小程序实现页面多级来回切换的示例代码

    小程序实现页面多级来回切换的示例代码

    这篇文章主要为大家详细介绍了小程序如何页面多级来回切换支持滑动和点击操作,文中的实现步骤讲解详细,快跟随小编一起动手尝试一下吧
    2022-07-07
  • 获取网站跟路径的javascript代码(站点及虚拟目录)

    获取网站跟路径的javascript代码(站点及虚拟目录)

    js获取网站根路径(站点及虚拟目录) ,需要的朋友可以参考下。
    2009-10-10
  • JavaScript对象创建模式实例汇总

    JavaScript对象创建模式实例汇总

    这篇文章主要介绍了JavaScript对象创建模式,结合实例形式总结分析了JavaScript常见的对象创建模式,包括工厂模式、构造函数模式、原型模式、动态原型模式、寄生构造函数模式、稳妥构造函数模式等,需要的朋友可以参考下
    2016-10-10
  • JavaScript中防抖和节流的实战应用记录

    JavaScript中防抖和节流的实战应用记录

    防抖与节流都是用来限制用户频发触发事件的机制,下面这篇文章主要给大家介绍了关于JavaScript中防抖和节流的实战应用,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • js插件实现图片滑动验证码

    js插件实现图片滑动验证码

    这篇文章主要为大家详细介绍了js插件实现图片滑动验证码,滑动模块,实现验证功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论