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为同一值的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# js
# for循环输出
# JS for循环中i++ 和 ++i的区别介绍
# JavaScript中for循环的几种写法与效率总结
# javascript 使用for循环时该注意的问题-附问题总结
# 都是
# 一个函数
# 给大家
# 就会
# 希望能
# 弹出
# 一个问题
# 这篇
# 浅谈
# 解决办法
# 小编
# 大家多多
# 而不是
# 在每个
# head
# http
# meta
# lt
# html
# gt
相关文章:
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
广州营销型建站服务商推荐:技术优势与SEO优化解析
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
教程网站设计制作软件,怎么创建自己的一个网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
油猴 教程,油猴搜脚本为什么会网页无法显示?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
如何快速搭建高效WAP手机网站?
威客平台建站流程解析:高效搭建教程与设计优化方案
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
西安专业网站制作公司有哪些,陕西省建行官方网站?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
如何制作网站标识牌,动态网站如何制作(教程)?
网站制作难吗安全吗,做一个网站需要多久时间?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
如何快速建站并高效导出源代码?
宝塔新建站点为何无法访问?如何排查?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
如何零基础开发自助建站系统?完整教程解析
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何设置并定期更换建站之星安全管理员密码?
如何快速选择适合个人网站的云服务器配置?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
,网站推广常用方法?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
建站之星备案流程有哪些注意事项?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
如何撰写建站申请书?关键要点有哪些?
jQuery 常见小例汇总
建站之星展会模版如何一键下载生成?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
建站VPS配置与SEO优化指南:关键词排名提升策略
网页设计与网站制作内容,怎样注册网站?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
建站主机功能解析:服务器选择与快速搭建指南
家庭服务器如何搭建个人网站?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
制作旅游网站html,怎样注册旅游网站?
如何用搬瓦工VPS快速搭建个人网站?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
,sp开头的版面叫什么?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何在自有机房高效搭建专业网站?
如何用VPS主机快速搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。