Stellen Sie sich das folgende Problem vor: Ich möchte ein Array von Funktionen erstellen, jede Funktion druckt nur ihren Index in diesem Array. In Python kann es verwenden wir Standardargument Werte als eine Möglichkeit, leicht mitStandardparameter und currying: Python vs. Javascript
funcs = []
for i in range(5):
funcs.append(lambda i=i: print(i))
funcs[2]()
# 2
hier getan werden, um zu tun currying (wenn ich den Begriff richtig verstehen).
Vor ES6 gab es in Javascript keine Standardargumentwerte, daher musste das Curry auf andere Weise durchgeführt werden. Jetzt haben wir sie und ich habe versucht, Python ins Javascript wörtlich zu übersetzen:
funcs = []
for (var i=0; i<5; i++) {
funcs.push(function (i=i) {console.log(i)})
}
# this part pass OK
funcs[2]()
ReferenceError: i is not defined
at Array.<anonymous> (evalmachine.<anonymous>:3:27)
at evalmachine.<anonymous>:1:9
at ContextifyScript.Script.runInThisContext (vm.js:26:33)
at Object.exports.runInThisContext (vm.js:79:17)
at run ([eval]:608:19)
at onRunRequest ([eval]:379:22)
at onMessage ([eval]:347:17)
at emitTwo (events.js:106:13)
at process.emit (events.js:191:7)
at process.nextTick (internal/child_process.js:752:12)
Warum es scheitert? Was ist der Unterschied zwischen Python und Javascript Möglichkeiten, um Standardwerte zu übergeben?
(Okay, ich weiß, dass ich let
hier statt var
verwenden können, ich studiere nur Javascript nach mehreren Jahren mit Python und versuchen, es underhoods zu verstehen.)
Verwenden Sie einfach einen anderen Variablennamen, 'j = i' dann' console.log (j) ' – elclanrs
Dies hat nichts mit Currying zu tun. Dies hat mit der späten Bindung von Closures in Python zu tun. Dies ist ein Hack, der die Tatsache ausnutzt, dass die Standardargumente in Python zur Zeit der Funktionsdefinition gesetzt sind, so dass Sie die frühe Bindung simulieren können. Wahrscheinlich liegen da die Unterschiede mit Javascript (das meiner Meinung nach auch spätbindenden Schließungen hat). –
@elclanrs das Ändern des Variablennamens stellt einfach ein anderes Problem dar, das ist die Schließung, die durch die for-Schleife erzeugt wird, in der 'funcs [n]' immer den maximalen Wert von 'i' zurückgibt. Auf was juanpa.arrivillaga mit späten vs simulierten frühen Bindung in Schließungen anspielte. – mhodges