javascript - 尝试在 foreach 循环中将变量传递到对象的方法构造函数时出现范围问题

标签 javascript jquery

我了解以下代码块中发生的情况,但不确定如何修复它:

for (var i = 0; i < songs.length; i++){
    var listItem = $('<li/>').appendTo(songList);

    var song = songs[i];

    var link = $('<a/>', {
        id: song.id,
        href: '#' + song.id,
        text: song.name,
        contextmenu: function(e){
            var contextMenu = new ContextMenu(song);
            contextMenu.show(e.pageY, e.pageX);

            //Prevent default context menu display.
            return false;
        }
    }).appendTo(listItem);
}

在这种情况下,当在 contextmenu 方法内部访问时,歌曲将始终是 foreach 循环中迭代的最后一个项目。我想知道如何使链接与其定义的歌曲之间存在 1:1 的关系。

我尝试将歌曲对象分配为链接对象的属性(通过 this.song 访问),但它显示为未定义。

最佳答案

for (var i = 0; i < songs.length; i++){
    // note this
    (function(i) {
        var listItem = $('<li/>').appendTo(songList);

        var song = songs[i];

        var link = $('<a/>', {
            id: song.id,
            href: '#' + song.id,
            text: song.name,
            contextmenu: function(e){
                var contextMenu = new ContextMenu(song);
                contextMenu.show(e.pageY, e.pageX);

                //Prevent default context menu display.
                return false;
            }
        }).appendTo(listItem);
    // and this
    }(i));
}

参见this duplicate以获得解释。

关于javascript - 尝试在 foreach 循环中将变量传递到对象的方法构造函数时出现范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078763/

相关文章:

javascript - 显示幻灯片切换不起作用

javascript - Javascript JSON.stringify 和 PHP json_encode 一样吗?

javascript - 无法通过 GWT 中的 JsInterop 将 Java 类导出到 JavaScript

javascript - jQuery 根据最后一个逗号后的数字对数组进行排序

javascript - 动态创建的样式元素

javascript - 单击切换后导航菜单折叠

javascript - 如果所有复选框都具有相同的名称,如何验证复选框选择?

javascript - 无限滚动仅在首页起作用

javascript - 带有列表js插件的多个过滤器

javascript - 将多个选择转换为常规选择