匿名函数中JS变量的范围是什么

时间:2012-11-01 22:57:31

标签: 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_identifier] = "xyz";
    }

});
connection.end();

console.log($products); // Shows empty.

1 个答案:

答案 0 :(得分:2)

它不会返回它为空;没有return声明。问题是该操作是异步。当您的console.log()调用运行时,查询尚未完成。

console.log()循环之后,将您的for调用移至内的回调函数。 (同时用var声明“i”!!!)

使用涉及回调的API的全部意义在于应对操作是异步的这一事实。如果它们是同步的,那么设计这样的接口会很奇怪。