JavaScript:For循环传递变量

JavaScript: For-Loop passing variables

本文关键字:变量 循环 For JavaScript      更新时间:2023-09-26

我遇到一个问题已经有一段时间了,找不到任何解决方案。尽管我已经在stackoverflow上读过这个问题和答案,但我还是不知道出了什么问题。可能是因为缺乏良好的英语。所以德国的答案是受欢迎的。

然而,我正在尝试将一个变量传递到for循环之外的另一个函数中。这是我的代码:

"use strict";
// gobal vars
var sort = new Array();
$(document).ready(function(){
// Sortable.js
// Copyright 2013-2015 Lebedev Konstantin <ibnRubaXa@gmail.com>
// http://rubaxa.github.io/Sortable/
    var min = 2,
        max = 5,
        elems = new Array();
    elems[0] = document.getElementById("left");
    elems[1] = document.getElementById("center");
    elems[2] = document.getElementById("right");
    for(var i=0, len=elems.length; i<len; i++) {
        var amnt = elems[i].getElementsByTagName("div").length,
            group = "gewicht";
        if (amnt <= min) {
            group = {name: "gewicht", pull: false, put: true};
        } else if (amnt >= max) {
            group = {name: "gewicht", pull: true, put: false};
        }
        sort[i] = Sortable.create(elems[i], {
            group: group,
            animation: 150,
            ghostClass:"ghost",
            draggable: ".draggable",
            onSort: function(evt) {sortEnd(evt, i, min, max)}
        })
    }
});
function sortEnd(evt, j, min, max) {
    var targ = evt.target,
        amnt = targ.getElementsByTagName("div").length;
    console.log(j);
    amnt = targ.getElementsByTagName("div").length;
    if (amnt <= min) {
        sort[j].option("group", {name: "gewicht", pull: false, put: true});
    } else if (amnt > max) {
        sort[j].option("group", {name: "gewicht", pull: true, put: false});
    } else {
        sort[j].option("group", {name: "gewicht", pull: true, put: true});
    }
}

问题出现在onSort: function(evt) {sortEnd(evt, i, min, max)},其中for循环中的变量i将为0、1和2。但在循环之外,函数sortEnd()中的console.log()会返回3。

一个我能理解的解释会很好,解决我的问题会更好,两者都是最好的。

感谢

对于链接的问题,您需要将您的操作包装在一个函数中:

(function(group, i) {
  sort.push(Sortable.create(elems[i], {
    group: group,
    animation: 150,
    ghostClass:"ghost",
    draggable: ".draggable",
    onSort: function(evt) {sortEnd(evt, i, min, max)}
  }))
}(group, i));

否则,groupi的每个实例都将引用相同的值。

此外,使用数组时,请使用push,而不是直接设置ID。

问题是您的i变量被捕获,然后它的值发生了变化。对此最好的解决方案是IIFE(立即调用的函数表达式):

for (var i = 0, len = elems.length; i < len; i++) {
  ..
  (function(val) {
    sort[val] = Sortable.create(elems[val], {
        group: group,
        animation: 150,
        ghostClass:"ghost",
        draggable: ".draggable",
        onSort: function(evt) {sortEnd(evt, val, min, max)}
    });
  })(i);
}