浅谈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有啥区别_空格与外边距的使用场景【说明】
南京网站制作费用,南京远驱官方网站?

