Frage

    

Diese Frage bereits eine Antwort hier:

         

Betrachten Sie den folgenden JavaScript-Code:

var a = [];

var f = function() {

    for (var i = 0; i < 3; i++) {
        a.push(function(){alert(i)});
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

Die Warnungen auszudrucken ‚3‘ alle drei Mal. Ich möchte ein anderes Verhalten - in jeder Iteration der Schleife eine Funktion erzeugen, die den aktuellen Wert von i druckt. D. h 3 Funktionen, die verschiedenen Indizes drucken.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Erstellen Sie eine anonyme Funktion, die i als Parameter akzeptiert und gibt, dass bestimmte Funktion:

for (var i = 0; i < 3; i++) {
    a.push((function(i) {
        return function() {
            alert(i);
        }
    })(i));
}

for (var j = 0; j < 3; j++) {
    a[j]();
}

oder etwas ähnliches: eine anonyme Funktion erstellen, die als Parameter i nehmen die Funktion zum Array hinzuzufügen:

for (var i = 0; i < 3; i++) {
    (function(i) {
        a.push(function() {
            alert(i);
        });
    })(i);
}

for (var j = 0; j < 3; j++) {
    a[j]();
}

Andere Tipps

Ein weiterer Ansatz, mit currying :

var a = [];
var f = function() {
    for (var i = 0; i < 3; i++) {
        a.push((function(a){alert(a);}).curry(i));
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

// curry implementation
Function.prototype.curry = function() {
  var fn = this, args = Array.prototype.slice.call(arguments);
  return function() {
    return fn.apply(this, args.concat(
      Array.prototype.slice.call(arguments)));
  };
};

Überprüfen Sie das obige Snippet läuft hier .

var iterate = (function () {
    var i, j = [];
    for (i = 0; i < 3; i += 1) {
        j.push(i);
        alert(j[j.length - 1]);
    }
}());

Sie müssen keine Schließung lediglich einen Wert auszugeben. Der Code sollte jedoch in einer Funktion für die objektorientierte Haltung enthalten sein. Funktionen müssen nicht aufgerufen werden, ausgeführt werden.

Sie können den Körper Ihrer Schleife in einer anonymen Funktion setzen:

var a = [];

for(var i = 0; i < 3; i++) (function(i) {
    a.push(function() { alert(i); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

Durch diese Funktion Erstellung und Weitergabe der Wert der Schleife von „i“ als Argument wir eine neue „i“ Variable innerhalb des Körpers der Schleife zu schaffen, die im wesentlichen verbirgt die äußere „i“. Das Verschluss man auf das Array schieben sieht jetzt die neue Variable, deren Wert gesetzt wird, wenn die äußere Funktion Funktion in der ersten Schleife genannt wird. Dies könnte klarer, wenn wir einen anderen Namen verwenden, wenn wir die neue Variable zu erstellen ... Das macht das Gleiche:

var a = [];

for(var i = 0; i < 3; i++) (function(iNew) {
    a.push(function() { alert(iNew); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

Der Wert von „ineu“ gleich 0 zugeordnet, dann 1, dann 2, da die Funktion sofort von der Schleife aufgerufen wird.

Funktion (i) {alert (i)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top