在内部JavaScript函数中包含外部对象
Including outer object in inner JavaScript function
我发现了一些似乎与此有关的问题,但从我的理解来看,我的问题有所不同,所以到此为止。我已经大大简化了我的代码,甚至用注释替换了其中一行,但概念是一样的。。。
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;
});
});
}
这将大大改善你的处境。至少,我希望它能帮助你更进一步。祝你好运。
我认为您面临这个问题是因为闭包,在整个myFunction
中使用的按钮变量是相同的,所有的更改都是引用更改,所以我认为将变量的声明更改为匿名函数内部应该可以解决这个问题。
function myFunction(options) {
//var button;
options.widgets.forEach(function (w) {
var button = document.createElement("button");
//add button to the DOM
aListOnMyPage.addEventListener("selectionchanged", function (args) {
var a = button;
});
});
}
此更改为CCD_ 5中的匿名函数提供了单独的CCD_。
相关文章:
- 如何访问对象内部的“categoryIds”字段/键,该对象包含mongodb's `ObjectId(s)`数
- IE8对象当对象包含null值时应出现错误
- 实际的angular js控制器对象包含什么
- RXJS5 - 按每个对象包含的可观察性过滤对象数组
- 如何在Jade编译之前将Javascript对象包含在Jade模板中
- json对象包含php DateTime,如何转换为漂亮的日期字符串
- 如何使JQuery对象包含Dom对象的快照
- 如果对象包含JavaScript中的字母,如何返回该对象
- 对象包含相同的值,但应该't
- 将一个对象包含在另一个对象中
- Mocha,Chai:断言对象包含在对象数组中
- 测试JSON对象包含我期望的属性
- 如何从json对象中提取数据,json对象包含具有不同类型对象的映射
- AngularJS$http发布对象包含数组的奇怪行为
- 我如何通过另一个对象访问一个对象,这个对象包含一个对象,这个对象是我想要访问的对象的属性
- 如何切换映射-发出一个对象包含原始和新的可观察对象
- 在这种情况下,我应该使用数组(包含对象)还是对象(包含对象)
- 如果对象包含在另一个数组中,则从该数组中删除该对象
- 将JSON发送到WebAPI - JSON对象包含一个图像(字节)-得到错误:表达式太长或太复杂而无法编译
- Angular -只有当数组中的对象包含completed:true时才启用按钮