为什么我总是得到分配给变量的最后一个值 即使我已经将其包含在函数中了?
触发鼠标向上的事件并调用getGoogleFiles时,将调用分配给resourceId的最后一个值。我不明白。
for ( var i in arrayObj) {
var resourceId = arrayObj[i].ResourceId;
entity_list.onmouseup = function(event) {
parent.changeButtonState(this, event);
(function(resourceId) {
getGoogleFiles(resourceId);
})(resourceId);
}
}
注意:这与其他JavaScript问题不同,因为不会触发onmouseup
我遵循了此处提到的另一个函数的创建: JavaScript closure inside loops – simple practical example
for ( var i in arrayObj) {
entity_list.onmouseup = function(event) {
parent.changeButtonState(this, event);
testing(arrayObj[i].ResourceId);
}
}
function testing(index){
return function() { getGoogleFiles(index); };
}
但是,当触发“ entity_list”的元素时,什么也没有发生。
我无法使用let
,因为我使用的特定浏览器返回了SyntaxError
SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
谢谢!
答案 0 :(得分:1)
您需要使用testing()
来创建侦听器函数,而不是在其中调用的函数。
for (var i in arrayObj) {
entity_list.onmouseup = testing(arrayObj[i].ResourceId, parent);
}
function testing(index, parent) {
return function(event) {
parent.changeButtonState(this, event);
getGoogleFiles(index);
};
}
但是,如果您使用forEach()
而不是for
循环,则无需进行任何操作,因为它会在每次迭代中为obj
创建一个新作用域。 / p>
arrayObj.forEach(function(obj) {
entity_list.onmouseup = function(event) {
parent.changeButtonState(this, event);
testing(obj.ResourceId);
}
});
答案 1 :(得分:0)
您不能在此处使用 var作用域变量。
但是您可以将resourceId
分配给相对html元素上的data attribute,以便在事件触发时可以读取它。
var arrayObj = [{ResourceId: "test1"}, {ResourceId: "test2"}, {ResourceId: "test3"}];
var entity_list = document.getElementsByClassName("entity_list");
for ( var i in arrayObj) {
entity_list[i].dataset.resourceId = arrayObj[i].ResourceId;
entity_list[i].onmouseup = function(event) {
getGoogleFiles(this.dataset.resourceId);
}
}
function getGoogleFiles(resourceId) {
console.log(resourceId);
}
<span class="entity_list">entity list (item 1)</span>
<span class="entity_list">entity list (item 2)</span>
<span class="entity_list">entity list (item 3)</span>