jQuery 事件处理程序的 JavaScript 闭包

标签 javascript jquery

我有一个对象列表,每个对象都有一个 .bullet,它是一个 SPAN。我想将跨度上的单击绑定(bind)到处理程序,而不是使用 jQuery 对跨度执行特定操作。我看到一些我不明白的行为,所以我希望有人能解释发生了什么。基本上,第一个代码示例有效:

for (var i = 0 ; i< length ; i++) {

            (function(){
                dataNode = dataNodeList[i];

                var handler = function(e) {

                    e.data.node.bullet.firstChild.nodeValue = "- ";


                };


                $(dataNode.bullet).on("click",{node:dataNode},handler);


            })();

        }

但是,第二种变体不起作用:

for (var i = 0 ; i< length ; i++) {

            (function(){
                dataNode = dataNodeList[i];

                var handler = function() {

                    dataNode.bullet.firstChild.nodeValue = "- ";


                };


                $(dataNode.bullet).on("click",handler);


            })();

        }

在第二个例子中,

dataNode.bullet.firstChild.nodeValue = "- ";

对我想要的 SPAN 的值没有影响。由于 JavaScript 关闭,我希望 dataNode.bullet 仍指向我想要更改的 SPAN。那么,有人可以解释为什么这会失败吗?谢谢。

最佳答案

试试这个:

for (var i = 0 ; i< length ; i++) {
    (function(index){
        var dataNode = dataNodeList[index];

        var handler = function() {
            dataNode.bullet.firstChild.nodeValue = "- ";
        };

        $(dataNode.bullet).on("click",handler);
    })(i);
}

闭包定义了一个新的作用域。这是必要的,因为你的处理程序直到循环完成后才会被调用,所以 i 在它被调用时不在范围内,或者(在某些情况下)具有最后一个可能的值从循环。

关于jQuery 事件处理程序的 JavaScript 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12499923/

相关文章:

javascript - 在 For in 循环中渲染复选框并在 Vue JS 中绑定(bind)它们的值

javascript - 尝试通过 PHP 通过 XML 请求下载图像文件

javascript - 单击添加/删除隐藏的溢出

javascript - 固定列表定位

javascript - 一个类轮删除多个对象属性

javascript - 我可以在 javascript 的消息框中加入链接吗?

jquery - 当其内联CSS为显示 block 时平滑跳转到目标div

javascript - 如何在php中使用ajax上传多张图片

javascript - 为什么jQuery或诸如getElementById之类的DOM方法找不到元素?

javascript - target _blank 打开后直接关闭