可能重复:
Javascript closure inside loops - simple practical example
我使用webservice通过使用javascript以JSON的形式获取数据,并希望将该数据存储在Sqlite数据库中。这里我用循环来通过executeSql Query在数据库中逐个存储数据。但问题是for循环内部的函数使“i”值超出范围意味着显示未定义。我试图在最近5天内解决这个问题。有什么建议吗?
由于
function GetGeoValues() {
$.get("http://example.in/projects/api.php?usn=user&pwd=****&var=something", function (Jdata) {
var geoid = new Array();
var geoname = new Array();
var i;
for (i = 0; i < Jdata.vact_geography.length; i++) {
geoid.push(Jdata.vact_geography[i].geo_id);
geoname.push(Jdata.vact_geography[i].geo_name);
db.transaction(function (transaction) {
alert(geoid[i]); // here i showing undefined
transaction.executeSql('INSERT INTO vact_geography VALUES(' + parseInt(geoid[i]) + ',"' + geoname[i] + '")');
});
}
});
}
答案 0 :(得分:0)
这里考虑了内部功能和外部功能概念。所以外部函数有var i。但在内部功能中我没有定义。这就是它的投掷错误为“未定义”
答案 1 :(得分:0)
我不确定,但如果function(transaction)
在异步模式下执行,则会发生这种情况。在这种情况下,i
循环完成后变量for
必须等于Jdata.vact_geography.length
,结果geoid[i]
等于undefined
。为了解决这个问题,请尝试下一步:
function GetGeoValues() {
$.get("http://example.in/projects/api.php?usn=user&pwd=****&var=something",
function(Jdata) {
var geoid=new Array();
var geoname=new Array();
for(var i=0;i<Jdata.vact_geography.length;i++) {
geoid.push(Jdata.vact_geography[i].geo_id);
geoname.push(Jdata.vact_geography[i].geo_name);
}
db.transaction(function(transaction) {
for(var i=0;i<geoid.length;i++) {
alert(geoid[i]); // here i showing undefined
transaction.executeSql('INSERT INTO vact_geography VALUES('+parseInt(geoid[i])+',"'+geoname[i]+'")');
// All INSERT's executed in one transaction
}
});
}
);
}