全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈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为同一值的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# js  # for循环输出  # JS for循环中i++ 和 ++i的区别介绍  # JavaScript中for循环的几种写法与效率总结  # javascript 使用for循环时该注意的问题-附问题总结  # 都是  # 一个函数  # 给大家  # 就会  # 希望能  # 弹出  # 一个问题  # 这篇  # 浅谈  # 解决办法  # 小编  # 大家多多  # 而不是  # 在每个  # head  # http  # meta  # lt  # html  # gt 


相关文章: 关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  广州营销型建站服务商推荐:技术优势与SEO优化解析  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  教程网站设计制作软件,怎么创建自己的一个网站?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  油猴 教程,油猴搜脚本为什么会网页无法显示?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何快速搭建高效WAP手机网站?  威客平台建站流程解析:高效搭建教程与设计优化方案  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  西安专业网站制作公司有哪些,陕西省建行官方网站?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  如何制作网站标识牌,动态网站如何制作(教程)?  网站制作难吗安全吗,做一个网站需要多久时间?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何快速建站并高效导出源代码?  宝塔新建站点为何无法访问?如何排查?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  如何零基础开发自助建站系统?完整教程解析  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何设置并定期更换建站之星安全管理员密码?  如何快速选择适合个人网站的云服务器配置?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  ,网站推广常用方法?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  建站之星备案流程有哪些注意事项?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何撰写建站申请书?关键要点有哪些?  jQuery 常见小例汇总  建站之星展会模版如何一键下载生成?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  建站VPS配置与SEO优化指南:关键词排名提升策略  网页设计与网站制作内容,怎样注册网站?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  建站主机功能解析:服务器选择与快速搭建指南  家庭服务器如何搭建个人网站?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  制作旅游网站html,怎样注册旅游网站?  如何用搬瓦工VPS快速搭建个人网站?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  ,sp开头的版面叫什么?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何在自有机房高效搭建专业网站?  如何用VPS主机快速搭建个人网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。