我有:
for (var i=0;i<2;i++) {
dbo.transaction(
function(myTrans) {
myTrans.executeSql(
'UPDATE myTable SET myField=0 WHERE myID=?'
,[i]
)
}
)
}
因为函数是回调函数,所以使用i = 2调用它。 问:如何用i = 0和i = 1来调用它?
注意:我想这就是发生了什么。我想我已经正确地说明了问题(这是因为循环结束后回调执行而引起的。)
答案 0 :(得分:3)
使用匿名函数捕获变量:
for (var i=0;i<2;i++) {
(function(i){
dbo.transaction(
function(myTrans) {
myTrans.executeSql(
'UPDATE myTable SET myField=0 WHERE myID=?'
,[i]
)
}
)
}(i));
}
答案 1 :(得分:2)
你可能对错误是什么。解决方法是在循环内部包含一个匿名函数,该函数包含一个新的,不变的i
变量,供封闭的代码查看。
for (var i=0;i<2;i++) {
(function(i) {
dbo.transaction(
function(myTrans) {
myTrans.executeSql(
'UPDATE myTable SET myField=0 WHERE myID=?'
,[i]
);
}
);
})(i);
}
ECMAScript Harmony(下一版JavaScript的提案)包括a new keyword, let
,它会更清晰。它会像这样工作:
for (var i=0;i<2;i++) {
let (i = i) {
dbo.transaction(
function(myTrans) {
myTrans.executeSql(
'UPDATE myTable SET myField=0 WHERE myID=?'
,[i]
);
}
);
}
}
甚至可以将var i
替换为let i
,但据我所知,目前尚未达成共识。