javascript - JavaScript "for"中的奇怪事情

标签 javascript jquery loops closures for-loop

我正在使用 jQuery,但我有一件我不明白的奇怪事情。我有一些代码:

for (i = 1; i <= some_number; i++) {
    $("#some_button" + i).click(function() {
        alert(i);
    });
}

“#some_button”,顾名思义 - 它们是一些按钮。单击时,他们应该弹出一个带有编号的框,对吗?但他们没有。如果有 4 个按钮,它们总是弹出“5”(按钮数 + 1)。为什么会这样?

最佳答案

它与 JavaScript 作用域有关。您可以通过添加一个函数并让该函数调用自身并传入 i 来引入另一个作用域,从而轻松解决这个问题:

for (var i = 1; i <= some_number; i++) {
  (function(j) {
    $("#some_button" + j).click(function() {
      alert(j);
    });
  })(i);
}

这会创建一个闭包 - 当内部函数可以访问调用该函数时不再存在的范围。参见 this article在 MDC 上获取更多信息。

编辑:回复:自调用函数:自调用函数是匿名调用自身的函数。您既不实例化它,也不将其分配给变量。它采用以下形式(注意左括号):

(function(args) {
  // function body that might modify args
})(args_to_pass_in);

关于这个问题,匿名函数的主体是:

$("#some_button" + j).click(function() {
  alert(j);
});

将这些组合在一起,我们在第一个代码块中得到了答案。匿名自调用函数需要一个名为 j 的参数。它会查找 ID 为 some_button 且末尾为整数值 j 的任何元素(例如 some_button1、some_button10)。任何时候单击其中一个元素时,它都会提醒 j 的值。方案倒数第二行传入值i,即调用匿名自调用函数的循环计数器。换一种方式,它可能看起来像这样:

var innerFunction = function(j) {
  $("#some_button" + j).click(function() {
    alert(j);
  });
};

for (var i = 1; i <= some_number; i++) {
  innerFunction(i);
}

关于javascript - JavaScript "for"中的奇怪事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150010/

相关文章:

javascript - CasperJS连续运行

javascript - jQuery 插件创作和/或构造函数注入(inject)

java - 循环遍历数组的各个部分

c++ - C/C++ 中的无限循环

javascript - 在 Javascript 中对整数数组执行计算

javascript - nginx 和奇偶校验的 Websocket 连接?

javascript - 如何下载/保存 PHP 生成的 HTML 页面的内容?

javascript - 扩展 json 对象 javascript

Jquery every - 停止循环并返回对象

javascript - 无限滚动: Loading more data with Ajax call?