浅谈js for循环输出i为同一值的问题

发布时间 - 2026-01-10 23:20:36    点击率:

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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 成都网站制作公司哪家好,四川省职工服务网是做什么用?  Python文件流缓冲机制_IO性能解析【教程】  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  高防服务器:AI智能防御DDoS攻击与数据安全保障  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  网易LOFTER官网链接 老福特网页版登录地址  Android okhttputils现在进度显示实例代码  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Python图片处理进阶教程_Pillow滤镜与图像增强  详解Android中Activity的四大启动模式实验简述  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  网站制作壁纸教程视频,电脑壁纸网站?  java ZXing生成二维码及条码实例分享  北京的网站制作公司有哪些,哪个视频网站最好?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  浅谈javascript alert和confirm的美化  如何确保FTP站点访问权限与数据传输安全?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  详解Huffman编码算法之Java实现  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel Session怎么存储_Laravel Session驱动配置详解  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  企业网站制作这些问题要关注  如何在香港免费服务器上快速搭建网站?  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel如何创建自定义Artisan命令?(代码示例)  网页设计与网站制作内容,怎样注册网站?  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何在云主机快速搭建网站站点?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  电商网站制作价格怎么算,网上拍卖流程以及规则?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  javascript读取文本节点方法小结  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel怎么为数据库表字段添加索引以优化查询  敲碗10年!Mac系列传将迎来「触控与联网」双革新  大同网页,大同瑞慈医院官网?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  南京网站制作费用,南京远驱官方网站?