Javascript 匿名函数中JS变量的作用域是什么

Javascript 匿名函数中JS变量的作用域是什么,javascript,node.js,Javascript,Node.js,为什么这段代码返回$products为空?如果我在函数中测试$products,它会显示数据。。。但一旦它完成,我似乎无法获得数据 var $products = new Array(); connection.query($sql, function(err, rows, fields) { if (err) throw err; for(i=0; i< rows.length; i++) { $products[rows[i].source_id

为什么这段代码返回$products为空?如果我在函数中测试$products,它会显示数据。。。但一旦它完成,我似乎无法获得数据

var $products = new Array();
connection.query($sql, function(err, rows, fields) {
    if (err) throw err;
    for(i=0; i< rows.length; i++)
    {
        $products[rows[i].source_identifier] = "xyz";
    }

});
connection.end();

console.log($products); // Shows empty.
var$products=new Array();
query($sql,函数(err,行,字段){
如果(错误)抛出错误;
对于(i=0;i
它不会返回空值;没有
return
语句。问题是操作是异步的。运行
console.log()
调用时,查询尚未完成

console.log()
调用移动到该回调函数内部,在
for
循环之后。(同时用
var
声明“i”!!)


使用包含回调的API的全部意义在于处理操作是异步的这一事实。如果它们是同步的,那么设计这样一个接口就太奇怪了。

欢迎来到异步的奇妙世界!你不能那样做。我的第一反应是这是一个异步问题。。。。我试着回电话,但我得到了奇怪的数据。。你能举个简单的例子吗?谢谢。@smorhaim添加一个
返回
没有任何作用,因为它只是将它返回给在对
连接的调用中建立的异步上下文中调用的回调。query
。简而言之,您不能在回调之外访问填充的
$products
。@smorhaim,对
连接.query的调用几乎立即返回。您只留下一个回调函数在结果到达时运行。