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


Posted in Javascript onMarch 01, 2017

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中的XML
Sep 14 Javascript
js+JQuery返回顶部功能如何实现
Dec 03 Javascript
用javascript关闭本窗口不弹出询问框的方法
Sep 12 Javascript
一个JavaScript递归实现反转数组字符串的实例
Oct 14 Javascript
jQuery中closest()函数用法实例
Jan 07 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
Feb 26 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 Javascript
关于原生js中bind函数的简单实现
Aug 10 Javascript
js断点调试心得分享(必看篇)
Dec 08 Javascript
vue 修改 data 数据问题并实时显示的方法
Aug 27 Javascript
对layui中table组件工具栏的使用详解
Sep 19 Javascript
jQuery EasyUI Draggable拖动组件
Mar 01 #Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
Feb 28 #Javascript
jQuery EasyUI ProgressBar进度条组件
Feb 28 #Javascript
jQuery实现ajax无刷新分页页码控件
Feb 28 #Javascript
jQuery EasyUI Panel面板组件使用详解
Feb 28 #Javascript
AngularJS constant和value区别详解
Feb 28 #Javascript
微信小程序左右滑动切换页面详解及实例代码
Feb 28 #Javascript
You might like
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
React中的render何时执行过程
2018/04/13 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
使用Python进行目录的对比方法
2018/11/01 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
用python进行视频剪辑
2020/11/02 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
Pandas之缺失数据的实现
2021/01/06 Python
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
《长相思》听课反思
2014/04/10 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
慈善募捐倡议书
2015/04/27 职场文书
开场白怎么写
2015/06/01 职场文书
大学生受助感言
2015/08/01 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS