javascript - 在内部 JavaScript 函数中包含外部对象

标签 javascript html

我发现了一些似乎与此相关的问题,但就我的理解而言,我的有所不同,所以这里是。 我极大地简化了我的代码,甚至用注释替换了一行,但概念是相同的......

function myFunction(options) {
    var button;
    options.widgets.forEach(function (w) {
        button = document.createElement("button");
        //add button to the DOM
        aListOnMyPage.addEventListener("selectionchanged", function (args) {
            var a = button;
        });
    });
}

因此,对于每个小部件,我创建一个新对象,然后将事件监听器添加到页面上的列表中,该列表的函数需要引用我创建的 DOM 元素(按钮)。 我看到的行为是我的按钮在创建事件监听器时正确设置,但是当监听器的事件触发时,按钮始终是对我创建的最后一个按钮的引用。 也许是因为已经晚了,但我无法理解为什么会这样。谁能帮我澄清一下吗?

最佳答案

当然可以。

你的问题实际上是范围。让我们看一下您编写的代码:

function myFunction(options) {
    var button;
    options.widgets.forEach(function (w) {
        button = document.createElement("button"); // UH-OH...
        //add button to the DOM
        aListOnMyPage.addEventListener("selectionchanged", function (args) {
            var a = button;
        });
    });
}

注意到呃哦?您已声明 button 应等于 document.createElement("button"),但由于您没有使用 var 关键字,因此您声明了一个全局变量,而不是多个局部变量。这意味着每次循环运行时,监听器都会引用一个全局变量,这会导致出现问题。

确保在这里使用局部变量,如下所示:

function myFunction(options) {
    options.widgets.forEach(function (w) {
        var button = document.createElement("button"); 
        //add button to the DOM
        aListOnMyPage.addEventListener("selectionchanged", function (args) {
            var a = button;  
        });
    });
}

这应该会大大改善你的情况。至少,我希望它能帮助你更进一步。祝你好运。

关于javascript - 在内部 JavaScript 函数中包含外部对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12119774/

相关文章:

javascript - IE9 相当于 querySelectorAll

javascript - 三个 Js 在 Y 轴上旋转网格以面向特定矢量位置

javascript - document.removeEventListener() 的问题

javascript - 访问选择选项并在第一行输入文本

javascript - 无法让 jquery.data() 或 .attr() 工作都返回未定义

html - 需要存储表的属性值以在 Karate 中进行断言

html - 交替 CSS 网格列和移动 View

javascript - D3 可折叠树 - 一次折叠一个级别

html - 内联 block 列表项之间的空格

jquery - 如何防止 anchor 滚动