这是一个由Javascript编写的for循环。它正在尝试对websql应用查询。
for (var i = 0; i < 10; i++){
db.transaction(function (tx){
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
});
}
尝试很明显,我尝试将值“0,1,2,... 9”添加到表ProjSetsT中的ProjID列中。这是行不通的。我只有最后一个元素,即插入“9”,但不是前8个数字。
是否有语法错误?
答案 0 :(得分:4)
我认为db.transaction
可能会异步运行,因此可能会为您搞砸。您是否尝试在事务中移动for循环?
db.transaction(function (tx){
for (var i = 0; i < 10; i++){
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
}
});
答案 1 :(得分:2)
作为参数传递的每个函数都与i
共享相同的引用,因此每个新函数对象的i
值都会递增。给定异步上下文,i
将在您在循环内创建的第一个函数被调用之前达到其最大大小
您可以使用闭包修复它:
for (var i = 0; i < 10; i++)
{
db.transaction((function(privateI)
{//privateI is unique for every function object
return function (tx)
{
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [privateI]);
};
})(i));//pass current value here
}
答案 2 :(得分:1)
您有多个函数引用相同的i
变量,最终为10
。
每个函数都需要一个新的变量范围。
for (var i = 0; i < 10; i++){
db.transaction(makeHandler(i));
}
function makeHandler(j) {
return function (tx){
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [j]);
};
}
现在i
已传递给makeHandler
,j
将其收到makeHandler
。
每次调用j
时,它都会返回一个引用其本地{{1}}变量的函数。