在鼠标事件中的for循环中分配值

时间:2019-05-02 07:12:55

标签: javascript loops

为什么我总是得到分配给变量的最后一个值 即使我已经将其包含在函数中了?

触发鼠标向上的事件并调用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

谢谢!

2 个答案:

答案 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>