2017-12-27 557 views
4

使用节点的MySQL我有以下代码:为什么此回调没有访问外部范围的正确值?

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

我预期的结果是#0,#1,...,#9,但实际的结果是#10印刷10次。很显然它在回调执行的时刻打印i的值,而不是创建回调。我怎样才能实现我想要的结果?

+0

'为(VAR I = 0; I <10; ++ⅰ)(功能(I){connection.query ('select 1',function(err,rows){console.log('#'+ i)})})(i);' –

回答

5

申报我让:

VAR I =>令i

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

你能解释为什么这会产生变化吗? – jordanm

+1

区别在于范围界定。 var的范围是最接近的功能块,let的范围是最近的封闭块,它可以小于功能块。如果在任何区块外,两者都是全球性 https://stackoverflow.com/questions/762011/whats-the-difference-between-using-let-and-var-to-declare-a-variable –

+2

这实际上没有帮助;你仍然只有一个变量。 – SLaks

相关问题