浅谈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 相关文章推荐
IE6下出现JavaScript未结束的字符串常量错误的解决方法
Nov 21 Javascript
JavaScript常用对象的方法和属性小结
Jan 24 Javascript
js网页中的(运行代码)功能实现思路
Feb 04 Javascript
javascript中的undefined和not defined区别示例介绍
Feb 26 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
Aug 22 Javascript
举例讲解jQuery中可见性过滤选择器的使用
Apr 18 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
Dec 29 Javascript
轻松理解Javascript变量的相关问题
Jan 20 Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
vue interceptor 使用教程实例详解
Sep 13 Javascript
vue单页应用在页面刷新时保留状态数据的方法
Sep 21 Javascript
quickjs 封装 JavaScript 沙箱详情
Nov 02 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
根德YB400的电路分析
2021/03/02 无线电
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
jQuery中closest()函数用法实例
2015/01/07 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
Python在图片中添加文字的两种方法
2017/04/29 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
几道PHP面试题
2013/04/14 面试题
货代行业个人求职简历的自我评价
2013/10/22 职场文书
培训楼经理岗位责任制
2014/02/10 职场文书
公司保密承诺书
2014/03/27 职场文书
群众路线党课主持词
2014/04/01 职场文书
创卫工作总结2015
2015/04/22 职场文书
公司备用金管理制度
2015/08/04 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
python缺失值的解决方法总结
2021/06/09 Python
Python可视化神器pyecharts绘制水球图
2022/07/07 Python