2017-12-27 1 views
4

unter Verwendung von Node-mysql Ich habe den folgenden Code:Warum ruft dieser Callback nicht den richtigen Wert des äußeren Bereichs auf?

for (var i = 0; i < 10; i++) { 
    connection.query('select 1', function(err, rows) { 
     console.log('#' + i); 
    }); 
} 

I das Ergebnis erwartet # 0, # 1, zu sein ..., # 9, aber das tatsächliche Ergebnis ist 10 # 10-mal gedruckt. Es ist offensichtlich, dass es den Wert i zum Zeitpunkt der Ausführung des Callbacks anstelle der Callback-Erstellung ausgibt. Wie kann ich mein gewünschtes Ergebnis umsetzen?

+0

'for (var i = 0; i <10; ++ i) (function (i) {connection.query ('select 1', Funktion (err, rows) {console.log ('#' + i)})}) (i); ' –

Antwort

5

Declare ich lassen:

var i => let i

for (let i = 0; i < 10; i++) { 
+1

Können Sie erklären, warum dies einen Unterschied macht? – jordanm

+1

Der Unterschied liegt in der Festlegung des Umfangs. var ist auf den nächsten Funktionsblock beschränkt und wird auf den nächsten umschließenden Block beschränkt, der kleiner als ein Funktionsblock sein kann. Beide sind global, wenn sie außerhalb eines Blocks liegen. https://stackoverflow.com/questions/762011/whats-the-difference-between-using-let-and-var-to-declare-a-variable –

+2

Das wird nicht wirklich helfen; Sie haben immer noch nur eine Variable. – SLaks

Verwandte Themen