Hier ist ein kleiner Ausschnitt des Codes, wo ich die Verschlussfunktion fühle eine seltsame Verhalten hat ...JavaScript Closure falsches Verhalten
var arr = [5, 6, 7, 8, 9, 0];
var someFn;
arr.forEach(function(val, idx) {
if (!someFn) {
someFn = function() {
console.log(`B: ${idx} : ${val}`);
};
}
console.log(`A: ${idx} : ${val}`);
someFn();
});
Die letzte Ausgabe der Konsole ist ...
A: 0 : 5 B: 0 : 5 A: 1 : 6 B: 0 : 5 A: 2 : 7 B: 0 : 5 A: 3 : 8 B: 0 : 5 A: 4 : 9 B: 0 : 5 A: 5 : 0 B: 0 : 5
ich erwarte someFn
, um den inkrementellen Wert zu verarbeiten, wenn forEach verarbeitet, aber es gibt immer den ersten Wert aus, der "idx: 0, val: 5"
ist.
Ich denke nicht das das richtige Verhalten ist, weil someFn
eine Schließung zu schaffen, die die Variablen umschließt idx
und val
und diese beiden Variablen in der äußeren Funktion zu verändern.
Schätzen Sie, wenn jemand dieses Verhalten freundlicherweise erklären kann.
Ich denke, es ist, weil Sie 'someFn erklärt () 'mit einem aktuellen Wert von 'idx' und 'val' und sobald Sie es weiter aufrufen, übergeben Sie keine neuen Werte von ihnen. – Lixus
Wenn Ihr Zustand es vermasselt: Verwenden Sie dies: var arr = [5,6,7,8,9,0]; var someFn; arr.forEach (function (val, idx) { someFn = function() { console.log ('B: $ {idx}: $ {val}'); }; someFn(); }); und es wird funktionieren. –
@baao das Problem hat nichts mit ** Template-Literalen ** zu tun. Also stimme ich das wieder zu öffnen. –