浅谈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 相关文章推荐
jquery 弹出层实现代码
Oct 30 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
Aug 30 Javascript
Jquery在指定DIV加载HTML示例代码
Feb 17 Javascript
javascript实现树形菜单的方法
Jul 17 Javascript
深入学习JavaScript中的Rest参数和参数默认值
Jul 28 Javascript
Node.js实用代码段之获取Buffer对象字节长度
Mar 17 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
Aug 24 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
Nov 03 Javascript
jQuery实现获取选中复选框的值实例详解
Jun 28 jQuery
微信小程序在text文本实现多种字体样式
Nov 08 Javascript
OpenLayer3自定义测量控件MeasureTool
Sep 28 Javascript
详解JavaScript之Array.reduce源码解读
Nov 01 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生成和获取XML格式数据的方法
2016/03/04 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
初识Node.js
2015/03/20 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
python分析apache访问日志脚本分享
2015/02/26 Python
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
python mysql断开重连的实现方法
2019/07/26 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
大学生两会学习心得体会
2014/03/10 职场文书
辅导员评语
2014/05/04 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
Java 定时任务技术趋势简介
2022/05/04 Java/Android
pandas中pd.groupby()的用法详解
2022/06/16 Python