浅谈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 相关文章推荐
利用404错误页面实现UrlRewrite的实现代码
Aug 20 Javascript
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
jquery ajax方式直接提交整个表单核心代码
Aug 15 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
Jan 10 Javascript
js弹出div并显示遮罩层
Feb 12 Javascript
jquery选择器简述
Aug 31 Javascript
JS实现的简易拖放效果示例
Dec 29 Javascript
VUE JS 使用组件实现双向绑定的示例代码
Jan 10 Javascript
jQuery选择器_动力节点Java学院整理
Jul 05 jQuery
AngularJS日程表案例详解
Aug 15 Javascript
小程序转发探索示例
Feb 19 Javascript
vue在线动态切换主题色方案
Mar 26 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
eAccelerator的安装与使用详解
2013/06/13 PHP
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
2018/08/21 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
js模块加载方式浅析
2017/08/12 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
Vue 监听元素前后变化值实例
2020/07/29 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
大学信息公开实施方案
2014/03/09 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
高中生逃课检讨书
2014/10/10 职场文书
2014年外联部工作总结
2014/11/17 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
导游词幽默开场白
2019/06/26 职场文书