浅谈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 prototype原型操作笔记
Dec 07 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
50个比较实用jQuery代码段
Sep 18 Javascript
jQuery中queue()方法用法实例
Dec 29 Javascript
jQuery学习笔记之2个小技巧
Jan 19 Javascript
js实现缓冲运动效果的方法
Apr 10 Javascript
基于jQuery实现在线选座之高铁版
Aug 24 Javascript
Javascript中的几种继承方式对比分析
Mar 22 Javascript
javascript的函数劫持浅析
Sep 26 Javascript
easyui messager alert 三秒后自动关闭提示的实例
Nov 07 Javascript
vscode+gulp轻松开发小程序的完整步骤
Oct 18 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和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
js取得html iframe中的元素和变量值
2014/06/30 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
深入理解JavaScript中的对象复制(Object Clone)
2016/05/18 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
原生js封装的ajax方法示例
2018/08/02 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
药学专业大专生的自我评价
2013/12/12 职场文书
大学系主任推荐信范文
2013/12/24 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
技校毕业生自荐信
2014/06/03 职场文书
司机工作自我鉴定
2014/09/19 职场文书
2014年酒店工作总结与计划
2014/11/17 职场文书
2015年团支书工作总结
2015/04/03 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
php去除数组中为0的元素的实例分析
2021/11/17 PHP
Python实现简单得递归下降Parser
2022/05/02 Python
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers