webkit执行句子和循环问题

时间:2011-06-27 12:04:37

标签: javascript webkit closures

我正在尝试在循环包含的executeSql函数中使用循环变量。但是如果我不使用闭包,循环变量会得到最后一个值。当我使用闭包时,我没有从executeSql函数获取结果列表。例子:

for (var i = 0; i < count; i++) {
tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [],
function(tx,results) //success function
{
//do something
}
,errorfunction);

}

成功功能“i”始终为“count + 1”。

为了解决这个问题,我改变了我的代码:

for (var i = 0; i < count; i++) {
tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [],
(function(tx,results) //success function
{
//do something
})(i)
,errorfunction);
}

有了这个,我就得到了“我”。但“结果”尚未定义。

我试图像这样传递“tx”和“i”:

    (function(tx,results) //success function
    {
    //do something
    })(tx,null,i)

有了这个我理解为什么我得到“结果”为null。我想学习如何获得executeSql的正确结果。

1 个答案:

答案 0 :(得分:3)

您正在寻找以下内容:

for (var i = 0; i < count; i++) {
   tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [],
      (function(i){
         return function(tx,results) //success function
         {
            //do something
         };
      })(i),
   errorfunction);
}

在一天结束时,您需要传递签名function(tx,res)的功能,这显然是整个(function(i){ return function(tx,res){ ... }; })(i)的功能,因为外部匿名函数立即执行并返回该签名的函数

当调用外部函数时(即每次迭代的值),该内部函数中的值i具有值i,因为值i是按值传递的进入外部匿名函数,因此返回的内部函数中对i的引用将正确解析。