浅谈js for循环输出i为同一值的问题

 更新时间:2017年03月01日 08:41:29   投稿:jingxian  
下面小编就为大家带来一篇浅谈js for循环输出i为同一值的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1、最近开发中遇到一个问题,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。

代码如下:

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>闭包演示</title> 
</head>  
<body>  
<p>1</p>  
<p>2</p>  
<p>3</p>  
<p>4</p>  
<p>5</p> 
<script type="text/javascript">
window.onload=function() {  
 var ps = document.getElementsByTagName("p");  
 for( var i=0; i<ps.length; i++ ) {  
   ps[i].onclick = function() {  
   alert(i);  
 }  
 }  
}  
</script> 
</body>  
</html>

此时点击任意p弹出的都是5

出现原因:js事件处理器在线程空闲时间不会运行,导致最后运行的时候输出的都是i最后的值,即:5

2、解决办法:使用闭包将变量i的值保护起来。

//sava1:加一层闭包,i以函数参数形式传递给内层函数 
 for( var i=0; i<ps.length; i++ ) {  
 (function(arg){   
  ps[i].onclick = function() {   
   alert(arg);  
  };  
 })(i);//调用时参数  
 } 


//save2:加一层闭包,i以局部变量形式传递给内存函数 
 for( var i=0; i<ps.length; i++ ) {  
 (function () {  
  var temp = i;//调用时局部变量  
  ps[i].onclick = function() {  
  alert(temp);  
  }  
 })();  
 }


//save3:加一层闭包,返回一个函数作为响应事件(注意与3的细微区别) 
 for( var i=0; i<ps.length; i++ ) {  
 ps[i].onclick = function(arg) {  
  return function() {//返回一个函数  
  alert(arg);  
  }  
 }(i);  
 } 


//save4:将变量 i 保存给在每个段落对象(p)上  
 for( var i=0; i<ps.length; i++ ) {  
  ps[i].i = i;  
  ps[i].onclick = function() {  
  alert(this.i);  
  }  
 }


//save5:将变量 i 保存在匿名函数自身  
 for( var i=0; i<ps.length; i++ ) {  
 (ps[i].onclick = function() {  
  alert(arguments.callee.i);  
 }).i = i;  
 }   
} 


//save6:用Function实现,实际上每产生一个函数实例就会产生一个闭包
 for( var i=0; i<ps.length; i++ ) {  
  ps[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例 
 } 


//save7:用Function实现,注意与6的区别  
 for( var i=0; i<ps.length; i++ ) {  
   ps[i].onclick = Function('alert('+i+')'); 
 }

以上这篇浅谈js for循环输出i为同一值的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解JavaScript中精度失准问题及解决方法

    详解JavaScript中精度失准问题及解决方法

    这篇文章主要介绍了JavaScript中精度失准问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 实现checkbox全选、反选、取消JavaScript小脚本异常

    实现checkbox全选、反选、取消JavaScript小脚本异常

    实现checkbox全选,反选,取消JavaScript小脚本的时出现点小异常,大家可以看看,以后就不要犯这个特别2的错误了
    2014-04-04
  • JS获取一个表单字段中多条数据并转化为json格式

    JS获取一个表单字段中多条数据并转化为json格式

    这篇文章主要介绍了JS获取一个表单字段中多条数据并转化为json格式的相关资料,需要的朋友可以参考下
    2017-10-10
  • 详细谈谈JavaScript中循环之间的差异

    详细谈谈JavaScript中循环之间的差异

    JS循环语句也叫迭代语句,是一种特殊的语句,主要用于需要多次执行的代码块,下面这篇文章主要给大家介绍了关于JavaScript中循环之间的差异的相关资料,需要的朋友可以参考下
    2021-08-08
  • js实现表格字段排序

    js实现表格字段排序

    本篇文章只要是对js表格字段排序的实例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • IE浏览器PNG图片透明效果代码

    IE浏览器PNG图片透明效果代码

    平常,我们经常使用Gif格式的图片以保持图片在浏览器中透明,以支持底色。但由于IE浏览器本身的原因,我们无法使透明的PNG图片透明起来。那么,如何将它在IE浏览器下变得透明呢?
    2008-09-09
  • JavaScript使用shift方法移除素组第一个元素实例分析

    JavaScript使用shift方法移除素组第一个元素实例分析

    这篇文章主要介绍了JavaScript使用shift方法移除素组第一个元素的用法,实例分析了javascript中shift方法的使用技巧,需要的朋友可以参考下
    2015-04-04
  • 网页与键盘

    网页与键盘

    网页与键盘...
    2006-07-07
  • 详解JS中的attribute属性

    详解JS中的attribute属性

    Attribute是属性的意思,文章仅对部分兼容IE和FF的Attribute相关的介绍。具体内容详情大家参考下本文
    2017-04-04
  • el-form实现表单和图片手动上传和校验功能

    el-form实现表单和图片手动上传和校验功能

    在写项目时,难免遇到需要上传表单,图片等文件,且表单内容需进行验证及必填项提示,图片需要和信息一起传递且图片载入后需可预览,这篇文章给大家介绍el-form实现表单和图片手动上传和校验功能,感兴趣的朋友一起看看吧
    2024-01-01

最新评论