Javascript WebSql 变量作用域

Javascript WebSql variables scope

为什么我无法在事务中访问 'i' 变量? console.log(数据);成功输出数据。 console.log(数据[i]);说未定义..

            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
                }); 
            });
        }

Why i cant access 'i' variable in transaction?

你可以,但它不会有你期望的价值。当循环完成时,交易回调被调用 later。该回调具有对 变量 i 的持久引用,而不是创建回调时其值的副本,因此它看到 i 的值为 data.length。所以你得到 undefined for 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,因为它已经为您提供了一个变量(好吧,一个参数)赢得了胜利'改变:

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
        });
    });
});