当前位置: 首页 > 面试题库 >

JavaScript在for循环中分配点击处理程序

祁嘉言
2023-03-14
问题内容

我有几个div的#mydiv1#mydiv2#mydiv3,…和要指派点击处理对他们说:

$(document).ready(function(){
  for(var i = 0; i < 20; i++) {
    $('#question' + i).click( function(){
      alert('you clicked ' + i);
    });
  }
});

但是,我没有得到单击'you clicked 3'时的显示#mydiv3(就像其他所有单击一样)'you clicked 20'。我究竟做错了什么?


问题答案:

在Javascript 中的循环中创建闭包是一个常见的错误。您需要具有以下某种回调函数:

function createCallback( i ){
  return function(){
    alert('you clicked' + i);
  }
}

$(document).ready(function(){
  for(var i = 0; i < 20; i++) {
    $('#question' + i).click( createCallback( i ) );
  }
});

由于这个问题仍然受到关注,并且ES6也越来越受欢迎,因此我建议使用一种现代的解决方案。如果您编写ES6,则可以使用let关键字,它使i变量在循环本地而不是全局:

for(let i = 0; i < 20; i++) {
  $('#question' + i).click( function(){
    alert('you clicked ' + i);
  });
}

它更短,更容易理解。



 类似资料:
  • 问题内容: 我有一个数组(称为),其中包含数百个天文学图像文件的名称。然后处理这些图像。我的代码有效,并且需要几秒钟来处理每个图像。但是,一次只能执行一张图像,因为我是通过循环运行阵列: 没有理由我必须先修改映像,因此可以利用计算机上的所有4个内核,每个内核都通过for循环在不同的映像上运行吗? 我已经阅读了有关该模块的信息,但是不确定如何在我的情况下实现它。我热衷于工作,因为最终我必须在10,0

  • 问题内容: 这个问题已经在这里有了答案 : 循环内的JavaScript封闭-简单的实际示例 (44个答案) 2年前关闭。 我正在运行以下形式的事件循环: 我正在尝试显示一系列警报,显示从0到10的数字。问题是,当触发回调函数时,循环已经经历了几次迭代,并且显示了更高的值。有关如何解决此问题的任何建议? 问题答案: 在启动所有异步操作时,循环将立即运行到完成。当他们将来完成某个时间并调用其回调时,

  • <---JS StackTrace---> =====JS栈迹=================================================================== 安全上下文:0x10178C2CFB51 2:main[/run-N6KBYU8CQZCNEXKH0TBM/solution.JS:~30][PC=0x2859725AEC0](this=0x10178

  • 问题内容: 我试图用NodeJS编写代码,从外部API抓取数据,然后使用Mongoose在MongoDB中填充它们。在这之间,我将检查该特定对象是否已经存在于Mongo中。下面是我的代码。 我的问题是,由于NodeJS回调是并行的,因此不会按顺序调用它。我的最终结果将是这样的: 呼叫报告API console.log(长度)= 100 ^^^^^^^^^^^^^^^^^^^^^^^^^ conso

  • 问题内容: 我在Javascript中遇到了奇怪的行为。我懂了 “对象不支持此属性或方法” 以下代码中的函数异常: 当我使用以下代码更改代码时,问题消失了: inside的值是多少? 问题答案: 不要用于数组迭代。 重要的是要了解,用于访问索引的Javascript数组的方括号语法()实际上是从… 继承的。 该结构不能像其他语言(php,python等)中所看到的那样更传统。 Javascript

  • 我试图使用处理程序线程设置一个延迟的for循环。但是当我在for循环中设置处理程序线程时,我不能使用for循环的索引,因为它说它必须被称为final,但这也不起作用。有人知道怎么修吗?