浅谈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 图片裁剪技巧解读
Nov 15 Javascript
jQuery的deferred对象详解
Nov 12 Javascript
深入理解Java线程编程中的阻塞队列容器
Dec 07 Javascript
jQuery代码实现对话框右上角菜单带关闭×
May 03 Javascript
Summernote实现图片上传功能的简单方法
Jul 11 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
Sep 04 Javascript
原生JS京东轮播图代码
Mar 22 Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 Javascript
JS控制鼠标拒绝点击某一按钮的实例
Dec 29 Javascript
Vue与Node.js通过socket.io通信的示例代码
Jul 25 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
实现Vue的markdown文档可以在线运行的方法示例
Dec 11 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加密函数 Javascript/Js 解密函数
2013/09/23 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
PHP crc32()函数讲解
2019/02/14 PHP
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
Python版名片管理系统
2018/11/30 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
美容院考勤制度
2014/01/30 职场文书
岗位聘任书范文
2014/03/29 职场文书
党员进社区活动总结
2015/05/07 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书