javascript - 在一个循环中,我附加了一个标记来提醒循环索引计数。为什么它总是提醒循环的最后一个索引?

标签 javascript jquery coffeescript

为了您的方便,here's an interactive jsfiddle version of my code.这是有问题的代码:

for i in [1, 2, 3, 4, 5, 6, 7, 8]
  console.log "cell #{i} was created!"
  cell = $('<div class="inventory-cell"></div>').mousedown (event) ->
    alert "#{i} was clicked!"
  $("#inventory-grid").append(cell)

这是 html:

<div id="inventory-dialog" class="dialog">    
    <div id="inventory-grid"></div>    
</div>

这是它应该如何工作的。这将在循环中生成一堆单元格。如果我点击第一个,我想让它提醒,“1 was clicked!”当我点击最后一个时,我希望它说,“8 被点击了!”但出于某种原因,我点击的每个人都说,“8 被点击了”。为什么会这样?

最佳答案

所有回调都在它们的主体中引用相同的 i 变量,在调用这些回调中的任何一个时,该变量的值为 8

您需要为每个特定回调创建一个本地变量,该变量在创建回调时保存 i:

(function(j) {
    var cell = $('<div class="inventory-cell"></div>').mousedown(function(event) {
        alert("#{j} was clicked!");
    });

    $("#inventory-grid").append(cell);
})(i);

功能上等效的 CoffeeScript 是:

do (i) ->
  cell = $('<div class="inventory-cell"></div>').mousedown (event) ->
    alert "#{i} was clicked!"

  $("#inventory-grid").append(cell)

唯一的区别是 do 会隐藏 i 而不是创建一个新变量,但结果是一样的。

准确的翻译是:

do (j = i) ->
  cell = $('<div class="inventory-cell"></div>').mousedown (event) ->
    alert "#{j} was clicked!"

  $("#inventory-grid").append(cell)

关于javascript - 在一个循环中,我附加了一个标记来提醒循环索引计数。为什么它总是提醒循环的最后一个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265279/

相关文章:

javascript - onkeypress ="return isNumberKey(event, this);"在 IE8 中调用该函数两次,每次在 javascript 中按下

javascript - 如何检查我的jsp文件是否转换为UTF-8

javascript - 通过 AJAX 将数据发送到 $_POST 数组

javascript - 如何让一个框在页面加载时从浏览器窗口的顶部出现?

javascript - 如何在 crossfilter 中舍入 reduceSum 的值?

html - 将 <td> 的值添加到文本框 onclick 时遇到问题

javascript - 如何将一个 div 插入另一个用 javascript 创建的

javascript - 通过backbone.js 路由区分后退/前进导航

javascript - ROR - CoffeeScript 导致 "Uncaught ReferenceError"

javascript - Spree - 无法覆盖 js.coffee 文件