Javascript WebSql 变量范围

标签 javascript web-sql

为什么我无法在事务中访问“i”变量? 控制台.log(数据);输出数据成功。 控制台.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?

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

对于这种情况,我通常使用构建器函数,以便回调在不更改的变量上关闭:

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

关于Javascript WebSql 变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32166670/

相关文章:

javascript - 创建具有值参数而不是引用的函数引用

javascript - 为搜索功能 jquery 追加输入文本字段

javascript - 重新加载页面时更改 location.hash

javascript - 如何访问每个 block 下划线内的对象属性

如果一个字母返回 true 的 Javascript 函数?

javascript - 检查 WebSQL 数据库时 Google Chrome 卡住

javascript - 适用于 iOS 的 Web SQL 增长数据库

html - iOS 7 网站主屏幕图标在启动时崩溃

javascript - 函数未同步返回值

javascript - 将 JavaScript websql 转换为 Clojurescript