Javascript WebSql变量范围

时间:2015-08-23 12:30:57

标签: javascript web-sql

为什么我无法在交易中访问'i'变量? 的console.log(数据);成功输出数据。 的console.log(数据[I]);说undefined ..

            for(var i = 0; i < data.length ; i++){
            db.transaction(function(tx){
                console.log(data);
                console.log(data[i]);
                tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[i].id], function(tx, results){
                   //do something
                }); 
            });
        }

1 个答案:

答案 0 :(得分:1)

  

为什么我无法在交易中访问'i'变量?

你可以,但它没有你期望的价值。循环完成后,事务回调称为稍后。该回调具有对变量 i的持久引用,而不是创建回调时其值的副本,因此它看到i的值为data.length }。因此,您undefined获得了data[i]

对于这种情况,我通常使用构建器函数,因此回调将关闭一个不会更改的变量:

for (var i = 0; i < data.length; i++) {
    db.transaction(buildHandler(i));
}
function buildHandler(index) {
    return function(tx) {
        console.log(data);
        console.log(data[index]);
        tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[index].id], function(tx, results) {
            //do something
        });
    };
}

这是有效的,因为buildHandler创建的函数会保留对index的引用,而index永远不会更改。

或者,在特定的情况下,你可以很好地利用Array#forEach,因为它已经为你提供了一个不会改变的变量(嗯,一个参数): / p>

data.forEach(function(entry, index) {
    db.transaction(function(tx) {
        console.log(data);
        console.log(data[index]);
        tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[index].id], function(tx, results) {
            //do something
        });
    });
});