Was ist die korrekte Semantik eines Abschlusses über eine Schleifenvariable? [geschlossen]

Betrachten Sie den folgenden Lua-Code:

f = {}

for i = 1, 10 do
    f[i] = function()
        print(i .. " ")
    end
end

for k = 1, 10 do
    f[k]()
end

Dies druckt die Zahlen von 1 bis 10. In diesem Falli wird über den Wert für jede Iteration der äußeren Schleife geschlossen. So hatte ich Verschlüsse immer verstanden und war sehr glücklich ...

... bis ich einen Lua-Code in c # portiert habe und das Gleiche versucht habe:

var f = new Action[10];

for (int i = 0; i < 10; i++)
{
    f[i] = (new Action(delegate()
    {
        Console.Write(i + " ");
    }));
}
for (int k = 0; k < 10; k++)
{
    f[k]();
}

Und jetzt bekomme ich die Nummer 10 zehnmal gedruckt (vergessen wir, dass Lua-Arrays 1-basiert sind). Es kommt tatsächlich vor, dass in diesem Fall der Abschluss über die Variable und nicht über ihren Wert erfolgt, was sehr sinnvoll ist, da ich die Funktionen erst aufrufe, wenn die erste Schleife beendet ist.

JavaScript scheint die gleiche Semantik zu haben (nah über der Variablen):

var f = []

for (var i = 0; i < 10; i++)
{
    f[i] = function()
    {
        document.write(i + ' ');
    };
}

for (var k = 0; k < 10; k++)
{
    f[k]();
}

Eigentlich sind beide Verhaltensweisen sehr sinnvoll, aber natürlich unvereinbar.

Wenn es einen "richtigen" Weg gibt, dann sind entweder lua oder c # und JavaScript falsch (ich habe es noch nicht mit anderen Sprachen versucht). Meine Frage lautet also: "Was ist die" richtige "Semantik beim Schließen einer Variablen in einer Schleife?"

edit: Ich frage nicht, wie ich das "reparieren" soll. Ich weiß, dass ich eine lokale Variable innerhalb der Schleife hinzufügen und über dieser schließen kann, um das Lua-Verhalten in c # / JavaScript zu erhalten. Ich möchte wissen, was die theoretisch korrekte Bedeutung des Schließens über eine geschleifte Variable ist, und Bonuspunkte für eine kurze Liste der Sprachen, in denen Schließungen in jeder Art und Weise implementiert werden.

edit: Um meine Frage umzuformulieren: "Wie ist das Verhalten beim Schließen einer geloopten Variablen in der Lambda-Rechnung?"

Antworten auf die Frage(4)

Ihre Antwort auf die Frage