循环中的闭包,怎么返回当前索引

for循环中的作用域 闭包 1.作用域的问题 作用域可以简单的理解为作用的范围,一般就是大括号就是一个域,也就是一个范围,一个空间,如果当前这个大括号内找不到变量的初始值,就回去上一级中去找,这里需要注意的有以下三点。 // for i 的作用域 for( var i = 0;i<4; i++){ //TODO } console.log(i); // 输出4,也就是 i 的作用域是在外面 // 多个script的情况 <script type="text/javascript"> var name 阅读详情

如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。
怎么实现每次点击就alert出对应的索引值?

<html >     
<head>     
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />     
<title>闭包演示</title>     
<script type="text/javascript">     

function init() {     
    var pAry = document.getElementsByTagName("p");     
    for( var i=0; i<pAry.length; i++ ) {     
         pAry[i].onclick = function() {     
         alert(i);     
    }     
  }     
}     
</script>     
</head>     
<body onload="init();">     
<p>产品一</p>     
<p>产品二</p>     
<p>产品三</p>     
<p>产品四</p>     
<p>产品五</p>     
</body>     
</html>     

解决方式:

1、将变量 i 保存给在每个段落对象(p)上

[javascript] view plaincopyprint?
function init() {     
  var pAry = document.getElementsByTagName("p");     
  for( var i=0; i<pAry.length; i++ ) {     
     pAry[i].i = i;     
     pAry[i].onclick = function() {     
        alert(this.i);     
     }     
  }     
}     

2、将变量 i 保存在匿名函数自身

[javascript] view plaincopyprint?
function init2() {     
  var pAry = document.getElementsByTagName("p");     
  for( var i=0; i<pAry.length; i++ ) {       
   (pAry[i].onclick = function() {     
        alert(arguments.callee.i);     
    }).i = i;     
  }     
}     

再增加3种

3、加一层闭包,i以函数参数形式传递给内层函数

[javascript] view plaincopyprint?
function init3() {     
  var pAry = document.getElementsByTagName("p");     
  for( var i=0; i<pAry.length; i++ ) {     
   (function(arg){         
       pAry[i].onclick = function() {         
          alert(arg);     
       };     
   })(i);//调用时参数     
  }     
}     

4、加一层闭包,i以局部变量形式传递给内存函数

[javascript] view plaincopyprint?
function init4() {     
  var pAry = document.getElementsByTagName("p");     
  for( var i=0; i<pAry.length; i++ ) {       
    (function () {     
      var temp = i;//调用时局部变量     
      pAry[i].onclick = function() {       
        alert(temp);       
      }     
    })();     
  }     
}     

5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

[javascript] view plaincopyprint?
function init5() {     
  var pAry = document.getElementsByTagName("p");     
  for( var i=0; i<pAry.length; i++ ) {       
   pAry[i].onclick = function(arg) {     
       return function() {//返回一个函数     
       alert(arg);     
     }     
   }(i);     
  }     
}    

6、用Function实现,实际上每产生一个函数实例就会产生一个闭包

[javascript] view plaincopyprint?
function init6() {     
    var pAry = document.getElementsByTagName("p");     
    for( var i=0; i<pAry.length; i++ ) {       
      pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例    
    }     
}    

7、用Function实现,注意与6的区别

[javascript] view plaincopyprint?
function init7() {     
    var pAry = document.getElementsByTagName("p");     
    for( var i=0; i<pAry.length; i++ ) {     
         pAry[i].onclick = Function('alert('+i+')')    
    }     
}     
【记录】游戏体验报告怎么写(自我成长篇) 2019年3月更新: 这个倒是不用推翻,我个人虽然写的东西还是有一些偏差的,但是“表哥”说的倒是没毛病的,这篇主要是为了记录用,具体的干货也有,都在图片里,请自行提取 =====18年初原答案 作为一个游戏策划新人,游戏分析可能抓不到点子上,试着总结记录一下游戏体验报告分析的成长(因为水平不同,视野可能也不一样,也许之后几年回头看这些东西都是小儿科或者是错误的,所以只写出当下的想... 阅读详情

相关推荐

中移物联ML307C模组OPENCPU笔记2

本文介绍了如何编译和运行一个DEMO程序,以官方SDK为例。

weixin_43700831的博客 1881

关于如何返回列表、数组对象的元素索引问题

1.列表 (1)使用enumerate()函数 x = [0, 1, 3, 2, 7, 0, 0] # 直接输入所有0出现位置的索引 index = [i for i, x in enumerate(pred) if x==0] print(index) (2)遍历索引 def get_index(list, item): return [i for i in range(len(list)) if list[i] == item] index = get_index(x, 0) print(index

weixin_46107893的博客 1328

国产麒麟系统PXE安装-UEFI引导

注意: 适用uefi引导 适用x86_64架构 一键部署脚本扣我 1.上传ISO到PXE服务器,拷贝ISO文件 # mkdir /kylin_iso # mount -o loop Kylin-Server-10-SP1-Release-Build04-20200711-x86_64.iso /kylin_iso/ 2.配置http,获取安装源 # yum -y install httpd # mkdir /var/www/html/{ks,kylin} # 注意一定是"/kylin_iso/

河静 5053

javascript 闭包获取当前元素的索引

html部分<button>button1</button> <button>button2</button> <button>button3</button> <button>button4</button>javascript 部分var btns = document.querySelectorAll('button'); var len = btns.length;for (i = 0; i

qiangD的博客 1459

银河麒麟V10SP1系统盘瘦身指南:如何制作一个只含必需软件的轻量级安装镜像

本文详细介绍了银河麒麟V10SP1系统盘瘦身的完整流程,从依赖分析到最小化镜像构建,帮助用户创建只含必需软件的轻量级安装镜像。通过智能包筛选、KickStart定制和性能优化,显著减少ISO体积和部署时间,适用于服务器批量部署等场景。

weixin_26765287的博客 404

kettle从入门到精通 第九十二课 ETL之kettle 使用Kettle的Carte对外发布读写接口

场景:使用kettle实现将查询结果返回给客户端,也就是说kettle暴露查询接口供外围系统调用。前提必须是使用carte服务才可以提供接口供外部系统调用。具体实操方法如下:1、设计转换根据具体需求设计转换,主要用到的步骤有获取变量(从请求参数中获取变量)、json输入(解析入参),json 输出将结果转换为json格式输出到客户端。如下图所示:2、接收参数使用获取变量步骤来接收接口请求参数,变量通过${}方法进行获取,如下图${PARAM}则是获取PARAM参数,将参数赋值为req字段。

zhangjin1222的博客 954

for循环中的闭包问题及解决方案

说到闭包,我们首先来看一个最最简单的例子,也是最最基础的例子:为多个相同的元素,绑定事件,在点击每一个元素时,提示被点击元素的排列位置。 栏目1 栏目2 栏目3 栏目4 拿到手的第一反应就是for循环添加点击事件了(添加索引值也可以!) 这里讨论闭包解决!(i=4   ,一直弹4,好烦!) function b

学无止境 5671

动力学约束下的运动规划算法——Hybrid A*算法(附程序实现及详细解释)

本文主要介绍动力学约束下的运动规划算法中非常经典的Hybrid A*算法,大致分为三部分,第一部分是在传统A * 算法的基础上,对Hybrid A * 算法的原理、流程进行理论介绍。第二部分是详细分析 MotionPlanning运动规划库中Hybrid A * 算法的源码,进一步深入对Hybrid A * 算法的具体细节 进行理解。 第三部分是结合前面第一部分的理论和第二部分的详细源码,对Hybrid A * 算法的流程进行综合的概括总结。

慕羽★的博客 1万+

js闭包执行结束后的那些事

var baz; (function(){    var foo =10;    var bar = 2;    baz = function(){      return foo * bar;    }; })(); baz();//20

boylufeng的专栏 493

19、时间触发通信与时间触发以太网技术解析

本文深入解析了时间触发通信和时间触发以太网(TTEthernet)技术,涵盖了其在实时系统中的应用,特别是安全关键领域如航空航天。文章详细介绍了TTEthernet的通信服务、协议参数化、时钟同步机制、诊断服务、故障隔离方法以及验证工作,并通过示例配置展示了其灵活性和可扩展性。TTEthernet通过引入确定性时间触发通信范式,在同一物理网络上实现了时间触发、速率受限和尽力而为三种流量类别的集成,为分布式实时系统提供了高可靠性和实时性保障。

efc12345678的博客 115

【图像分类】卷积神经网络之VGGNet网络模型实现花卉图像识别(附代码和数据集,PyTorch框架)

卷积神经网络之VGGNet网络模型实现花卉图像识别(附代码和数据集,PyTorch框架)

学无止境、积少成多、厚积薄发 2430

for循环中的索引值

首先我们看看for循环:for(var i=0; i< 6; i++){ console.log(i); }相信每个人都知道这个打印的结果吧! 这个结果是: 0 1 2 3 4 我们把for循环具体到某一个事例 我们平时点击tab切换时,如何获取索引值呢? 比如这个例子,代码如下: <!DOCTYPE html> <html> <head> <meta charset="ut

boysky0015的博客 9957

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jq遍历循环,给每个元素添加点击事件,并返回当前元素的索引值(闭包问题)

jq循环绑定点击事件造成闭包问题 需求:给每个带有tab类名的元素点击点击事件,点击时可以添加active类名,(用于样式切换),而且还需要返回当前元素对应的索引值: 方法一(出现闭包) 先引入jq jq引入之后的获取dom的方式: $(’.tab’) //获取到的是所有含有tab类名的元素,如果想要限制在某个区域内,可以再加个类名的限制。 $(’.tab’).each(function(index){ $(this).on(‘click’,function(){ console.log(index); $

yehaocheng520的博客 5923

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

javascript闭包获取table中tr的索引

javascript闭包获取table中tr的索引<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"xml:lang="en">

强子的专栏 4809

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

动画:什么是闭包?

写在前边 、 正在学习初学前端小伙伴,会感觉 HTML 和 CSS 太简单了,没什么挑战性。那是你没有学过 JS ,JS 中太多的概念初期学习的时候也是很懵逼的,比如 this、原型链、闭包等,即是重点,又是难点。但是你懂了之后会发现很简单,很好理解。 因为小鹿暑假去面试,每场面试基本都是必问的,不仅要知道理论,还要问你在实际项目中的实践,这部分内容很多人常常在实战中忽略掉。 今天的内容,就是...

小鹿动画学编程 4993

web前端高级JavaScript - 闭包的应用及循环事件绑定的N中解决办法

闭包在循环事件绑定中的应用 场景描述: 在页面上有3个button按钮,当点击每个按钮时输出当前按钮的索引值,要求用循环来绑定每个按钮的事件,看下面的代码。 <button>button1</button> <button>button2</button> <button>button3</button> var buttons = document.querySelectorAll('button'); for(var i

lixiaosenlin的专栏 5700

索引超出了数组界限——C#中的闭包

C# 闭包 循环 循环中使用委托和lambda注意

u011067892的博客 1648

获取for循环中的索引值

首先我们看看for循环: for(var i=0; i< 6; i++){ console.log(i); } 相信每个人都知道这个打印的结果吧! 这个结果是: 0 1 2 3 4 5 6 我们把for循环具体到某一个事例 我们平时点击tab切换时,如何获取索引值呢? 比如这个例子,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>闭包

IT_bar的博客 4127

闭包(闭包/闭包循环的索引值/ 闭包做私有变量计时器/闭包做选项卡)

闭包 &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;闭包&lt;/title&gt; &lt;script type="text/javascript"&gt; /* 闭包

weixin_43152725的博客 314

C# 中的闭包

首先来看一个简单的例子。 var list = new Action[5]; for (int i = 0; i < list.Length; i++) { list[i] = () => { Console.WriteLine(i); }; } ...

一土宁的博客 1096

循环中的异步&&循环中的闭包

在这之前先要了解一下 for循环中let 和var的区别 var 是函数级作用域或者全局作用域,let是块级作用域 看一个例子 function foo() { for (var index = 0; index &lt; array.length; index++) { //..循环中的逻辑代码 } console.log(index)...

weixin_34378922的博客 300

闭包案例:1. 循环注册点击事件 2. 循环中的 setTimeout() 3. 计算打车价格

1、循环注册点击事件。 2、循环中的 setTimeout()。 3、计算打车价格。

icemwj的博客 203

闭包应用-点击li输出当前li的索引号

// 闭包应用-点击li输出当前li的索引号 // 1. 我们可以利用动态添加属性的方式 var lis = document.querySelector('.nav').querySelectorAll('li'); for (var i = 0; i < lis.length; i++) { lis[i].index = i; lis[i].onclick = function() {...

weixin_43837268的博客 394

JS中的闭包

闭包

web$-小白 9207

html 怎么绑定闭包里的事件,JavaScript的闭包特性如何给循环中的对象添加事件(一)...

初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件。在事件响应函数中(event handler)获取对应的索引。但每次获取的都是最后一次循环的索引。原因是初学者并未理解JavaScript的闭包特性。1. HTML>2. 3. 4. 5. 闭包演示6. 7. p{background:gold;}8. 9. 10.functioninit(){11....

weixin_30556403的博客 179
上一篇: react入门,Hello World
下一篇: webpack基本使用
史蒂芬李
博客等级 码龄14年 7粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值