只有Javascript中for循环的最后一次运行才有效

时间:2012-09-25 15:36:19

标签: javascript html5 web-sql

这是一个由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个数字。

是否有语法错误?

3 个答案:

答案 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已传递给makeHandlerj将其收到makeHandler

每次调用j时,它都会返回一个引用其本地{{1}}变量的函数。