JavaScript for 循环索引奇怪[重复]

2023-12-11

我对 JS 比较陌生,所以这可能是一个常见问题,但我在处理 for 循环和 onclick 函数时注意到一些奇怪的事情。我能够用这段代码复制这个问题:

<html>
<head>

<script type="text/javascript">
window.onload = function () {
    var buttons = document.getElementsByTagName('a');
    for (var i=0; i<2; i++) {
        buttons[i].onclick = function () {
            alert(i);
            return false;
        }
    }
}

</script>

</head>

<body>
<a href="">hi</a>
<br />
<a href="">bye</a>

</body>

</html>

单击链接时,我希望得到“0”和“1”,但我却得到了“2”。为什么是这样?

顺便说一句,我设法通过使用“this”关键字解决了我的特定问题,但我仍然很好奇这种行为背后的原因。


你正拥有的一个非常常见的闭包问题 in the for loop.

封闭在闭包中的变量共享同一个环境,所以到了onclick回调被执行,循环已经运行并且i变量将保留指向最后一个条目。

您可以使用函数工厂通过更多闭包来解决此问题:

function makeOnClickCallback(i) {  
   return function() {  
      alert(i);
      return false;
   };  
} 

var i;

for (i = 0; i < 2; i++) {
    buttons[i].onclick = makeOnClickCallback(i);
}

如果您不熟悉闭包的工作原理,这可能是一个相当棘手的话题。您可以查看以下 Mozilla 文章以获取简要介绍:

  • 使用闭包

注意:我还建议不要使用var在 - 的里面for循环,因为这可能会欺骗你相信i变量具有块作用域,而另一方面i变量就像buttons变量,作用域在函数内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript for 循环索引奇怪[重复] 的相关文章

随机推荐

  • HTML 到 PDF 动态添加目录 (TOC)

    我正在使用 iText 7 将 html 转换为 PDF 但我什至找不到一个有关如何将目录添加到最终 PDF 的示例 按照 iText 示例 将文本转换为 PDF 并添加目录是一项简单的任务here 但显然在将 HTML 转换为 PDF 时
  • AngularJS HTTP post 到 PHP 且未定义

    我有一个带有标签的表格ng submit login 该函数在 javascript 中被调用得很好 function LoginForm scope http http defaults headers post Content Type
  • 如何用 sed 删除尾随空格?

    我有一个简单的 shell 脚本 可以从文件中删除尾随空格 有什么方法可以使这个脚本更加紧凑 无需创建临时文件 sed s t 1 gt 1 tmp cat 1 tmp gt 1 rm 1 tmp 您可以使用就地选项 i of sed对于
  • 执行 $.getJSON 后对 JSON 数组进行排序

    我的 json 对象和 getJSON 之间有工作连接 我还可以使用此代码对一次获得的数据进行排序 我在数组的 名称 字段上对它进行排序 它工作正常 getJSON url function json function sortJson a
  • 如何在istio中配置入口网关?

    我是 istio 的新手 我想通过 istio ingress gateway 访问我的应用程序 但我不知道为什么它不起作用 这是我的kubenetes deploy yaml文件内容 apiVersion v1 kind Service
  • 停止 RMI 服务器的干净方法

    RMI 服务器无需 stopServer 功能即可正常工作 public class HelloServer extends UnicastRemoteObject implements HelloInterface private fin
  • 更改状态时如何保留同级 ui 视图?

    我有2个ui view我的应用程序中的指令 一个包含子导航 另一个是实际的页面内容 我的子导航是树结构 当您单击结束节点 或叶子 时应该是内容视图唯一更新的时间 每当您单击子导航中的非叶节点时 我希望内容视图在子导航视图更改时保持不变 发生
  • DBMS 中的最大行数

    DBMS 特别是MySQL 中表的最大行数有限制吗 我想创建用于保存日志文件的表 并且其行增加得如此之快 我想知道我应该做什么来防止出现任何问题 我认为没有官方限制 这取决于最大索引大小和文件系统限制 From MySQL 5 0 特性 支
  • 数据库正在被另一个进程使用...但是什么进程呢?

    我编写了一个非常小的 C 程序 它使用一个非常小的 SQL Server 数据库 纯粹用于一些学习和测试目的 该数据库仅在这个新项目中使用 而没有在其他地方使用 但是 我在运行调试时遇到问题 程序无法运行 因为数据库 正在被另一个进程使用
  • 单元格中的 UIView -- 无法圆化右上角

    我有一个长方形UIView静态表视图单元格中的对象 我有一个通往物体的出口 我正在尝试有选择地圆角 但它不会圆化右侧的角 这是故事板中的样子 我要配置的视图是淡黄色的 红色视图除了确认另一个视图没有被裁剪之外没有任何实际用途 不存在约束问题
  • VBA IE 自动化 - 等待下载完成

    我正在尝试自动执行一些通过 Internet Explorer 完成的任务 其中包括下载文件 然后将其复制到不同的目录并重命名 我或多或少成功地找到了有关如何执行此操作的信息 代码正在运行 但有例外 因此如果有人可以帮助我改进此代码 我将不
  • 确定记录是否存在的最快方法

    正如标题所示 我试图找出以最少的开销最快的方法来确定表中是否存在记录 示例查询 SELECT COUNT FROM products WHERE products id vs SELECT COUNT products id FROM pr
  • 如何自定义 iOS 警报视图?

    我想创建一个自定义alert view在我的 iOS 应用程序中 例如 我想放一些images在这个alert 并更改其颜色 我知道如何创建一个正常的UIAlertView 但是有没有办法定制一个alert view 我设置了自己的 UIV
  • Chrome 扩展:XMLHttpRequest 已取消(状态 == 0)

    我尝试从服务器加载 json 文件XMLHttpRequest 但我只得到status 0Chrome 开发控制台显示 已取消 我可以用这个 简化的 代码重现这个 var httpReq new window XMLHttpRequest
  • Windows 错误 5:尝试在 Windows 中删除目录时访问被拒绝

    我正在尝试删除一个目录 但是当我运行代码时 它给出 Windows 错误 5 访问被拒绝 这是我的代码 在 Release 文件夹中 有一个名为OD if os path exists os path join get path for o
  • 具有固定行数的 ddply

    我想按 行数 分解数据 也就是说 我想向我的函数发送固定数量的行 当我到达数据帧的末尾 最后一个块 时 我只需要发送该块 无论它具有固定的行数还是更少 像这样的东西 ddply df 8 rows fun somefunction 如果你想
  • Odoo 8 - 如何更改页面标题?

    我想知道如何更改页面标题并从中删除 Odoo https www odoo com forum help 1 question change login page title 34874我尝试了这个 但我什么也没发现 标题使用标准 html
  • Python:运行进度条并同时工作?

    我想知道如何同时运行进度条和其他一些工作 然后当工作完成时 停止Python 2 7 x 中的进度条 import sys time def progress bar while True for c in sys stdout write
  • 当 DIV 的高度设置为“100%”时,为什么计算出的 DIV 高度大于其内容(如 svg)? [复制]

    这个问题在这里已经有答案了 这是我的代码 div align center style width 100 height 100 padding 0px margin 0px div
  • JavaScript for 循环索引奇怪[重复]

    这个问题在这里已经有答案了 我对 JS 比较陌生 所以这可能是一个常见问题 但我在处理 for 循环和 onclick 函数时注意到一些奇怪的事情 我能够用这段代码复制这个问题