Javascript数组的奇怪行为。全局声明无法保存值
我的一个函数中有以下代码。我有一个数组'arr',它在if{}中使用时工作正常。但是现在在外面使用时它可以工作了。谁能告诉我我错过了什么Javascript数组的奇怪行为。全局声明无法保存值,javascript,arrays,Javascript,Arrays,我的一个函数中有以下代码。我有一个数组'arr',它在if{}中使用时工作正常。但是现在在外面使用时它可以工作了。谁能告诉我我错过了什么 function runQueries() { var arr = new Array; db.transaction (function (transaction) { var sql = "SELECT * FROM incomecategory"; transaction.execut
function runQueries()
{
var arr = new Array;
db.transaction (function (transaction)
{
var sql = "SELECT * FROM incomecategory";
transaction.executeSql (sql, undefined,
function (transaction, result)
{
if (result.rows.length)
{
for (var i = 0; i < result.rows.length; i++)
{
var row = result.rows.item (i);
var categoryname = row.categoryname;
arr[i] = categoryname;
}
//alert(arr[0]); // It works
}
else
{
}
}, error);
});
//alert (arr[0]); // It doesn't work.
}
函数runquerys()
{
var-arr=新数组;
db.transaction(功能(事务)
{
var sql=“从incomecategory中选择*”;
transaction.executeSql(sql,未定义,
功能(事务、结果)
{
if(result.rows.length)
{
对于(var i=0;i
这是异步行为。代码底部的警报可能在数据库查询之前执行 这是异步行为。代码底部的警报可能在数据库查询之前执行 打开浏览器的错误控制台,查看是否出现javascript错误不确定此webSQL ish代码在哪个框架下运行,但它们通常是异步的。直到外部函数退出(因此,在警报
调用之后),该事务函数才真正运行。这是因为当您发出警报(arr[0])时,您的数组仍然为空。如果您在内部发出alert(“a”)
,在外部发出alert(“b”)
,则在sql执行完毕后,它将首先向“b”发出警报,然后向“a”发出警报。打开浏览器的错误控制台,查看是否出现任何javascript错误不确定此webSQL ish代码在哪个框架下运行,但它们通常是异步的。直到外部函数退出(因此,在警报
调用之后),该事务函数才真正运行。这是因为当您发出警报(arr[0])时,您的数组仍然为空。如果您在内部发出警报(“a”),在外部发出警报(“b”),则当您的sql完成执行时,它将首先向“b”发出警报,然后向“a”发出警报。/cf。您需要做的是调用一个回调函数,该函数在“if”中接收数组作为参数(并执行您需要它执行的任何操作)。谢谢。我理解这个问题。有没有办法延迟arr的使用,使其仅在数据库查询后使用?使用回拨功能是一种选择。但就我而言,这将是非常复杂的。这个arr应该包含类别。然后,我准备了另一个函数,它运行另一个查询来保存另一个数组中每个类别的总数。然后我有第三个计算百分比的函数。最后,第四个函数将使用这些数组系列中的值创建图形。/agreed。您需要做的是调用一个回调函数,该函数在“if”中接收数组作为参数(并执行您需要它执行的任何操作)。谢谢。我理解这个问题。有没有办法延迟arr的使用,使其仅在数据库查询后使用?使用回拨功能是一种选择。但就我而言,这将是非常复杂的。这个arr应该包含类别。然后,我准备了另一个函数,它运行另一个查询来保存另一个数组中每个类别的总数。然后我有第三个计算百分比的函数。最后,第四个函数将使用这些数组系列中的值创建图形。