浅谈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 相关文章推荐
js获取变量
Aug 24 Javascript
新手入门常用代码集锦
Jan 11 Javascript
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
Feb 22 Javascript
早该知道的7个JavaScript技巧
Mar 27 Javascript
利用JS实现浏览器的title闪烁
Jul 08 Javascript
基于Javascript实现弹出页面效果
Jan 01 Javascript
js判断某个字符出现的次数的简单实例
Jun 03 Javascript
JavaScript实现三级联动菜单效果
Aug 16 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
May 22 Javascript
微信小程序下拉框搜索功能的实现方法
Jul 31 Javascript
使用layer.msg 时间设置不起作用的解决方法
Sep 12 Javascript
利用JavaScript写一个简单计算器
Nov 27 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/25 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
Python登录注册验证功能实现
2018/06/18 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
python实现多进程代码示例
2018/10/31 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
python创建文本文件的简单方法
2020/08/30 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
电子信息工程专业求职信
2014/06/28 职场文书
疾病证明书
2015/06/19 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书