浅谈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压缩工具:X2JSCompactor
Jun 13 Javascript
初试jQuery EasyUI 使用介绍
Apr 01 Javascript
asm.js使用示例代码
Nov 28 Javascript
JS小游戏之极速快跑源码详解
Sep 25 Javascript
jQuery获得指定元素坐标的方法
Apr 14 Javascript
JavaScript必知必会(十) call apply bind的用法说明
Jun 08 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
Feb 16 Javascript
JS实现的随机排序功能算法示例
Jun 09 Javascript
微信小程序自定义prompt组件步骤详解
Jun 12 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
Jul 09 Javascript
微信小程序实现蒙版弹出窗功能
Sep 17 Javascript
js实现微信聊天界面
Aug 09 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自定义函数返回多个值
2006/11/26 PHP
php文件读取方法实例分析
2015/06/20 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
详解Vue之计算属性
2020/06/20 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
Tensorflow 查看变量的值方法
2018/06/14 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
高中毕业自我鉴定
2013/12/22 职场文书
高中运动会入场词
2014/02/14 职场文书
《乞巧》教学反思
2014/02/27 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
党员年度个人总结
2015/02/14 职场文书
刑事起诉书范文
2015/05/19 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
Golang中异常处理机制详解
2021/06/08 Golang