javascript - 我怎么会误解这个例子中的 JavaScript 闭包解析?

标签 javascript closures

我以为我了解 JavaScript 闭包,但显然我不了解。从我的代码中摘录以下内容:

for(var i=0; i<data.List.length; i++) {
    var entry = data.List[i]; // I thought this line should have resolved the issue?
    $('<tr class="logs-list-item"><td class="lefticon nowrap"><a href="javascript:void(0)"></a></td><td class="right nowrap"></td></tr>')
        .appendTo(tbody)
        .find('a').text(entry.Text)
        .click(function() {
            alert(entry.Text + ' ' + entry.Filename);
            showLog(id, entry.Filename);
        })
        .closest('tr').find('td:last').text(entry.When);
}

如您所见,我们正在遍历文件名条目列表,并为每个条目添加一个表行,其中包含一些描述文件的文本,并为每个应该调用函数的条目添加一个 onclick 处理程序 showLog() 包含所选文件名的详细信息。

实际上发生的是,所有行都正确添加,但每一行都被分配了一个处理列表中最后一项的处理程序。

在第 2 行,我在 for 循环中定义了一个变量,并在闭包中访问了该变量,但是当实际调用该函数时,它最终似乎没有正确解析。

知道我做错了什么吗?

最佳答案

Javascript 没有 block 级作用域。
即使变量是在循环内定义的,它仍然是共享的。

您需要将循环体移动到一个单独的函数中。

关于javascript - 我怎么会误解这个例子中的 JavaScript 闭包解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5291816/

相关文章:

javascript - 如何在 CSS 和 HTML 中使用过渡

javascript - 如何使用 jsGrid 将项目获取到字段中的下拉列表?

javascript - 在组件内部定义自定义 Hook 有什么问题吗?

使用 IntelliJ IDEA 在 Groovy 中调试迭代(闭包)

lambda - Lisp 代码数据对偶性、Lambda 表达式是常量吗?

javascript - 如何深入理解Javascript的var作用域和闭包?

php - 将数据从 PHP 发送到不同域中的 Javascript

javascript - 是否可以在 Javascript 的变量名中添加两个点?

javascript - 当我使用 Node.js 作为 Web 应用程序时,我应该使用 sql 还是 Json 存储数据

ios - 如何在 Swift 中创建一个 ((NSErrorPointer -> NSData!)!) 闭包