Javascript WebSql变量作用域

Javascript WebSql variables scope

本文关键字:作用域 变量 WebSql Javascript      更新时间:2023-09-26

为什么我不能访问事务中的'i'变量?console.log(数据);输出数据成功。[我]console.log(数据);表示定义. .

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

为什么我不能在事务中访问'i'变量?

你可以,但它不会有你期望的值。当循环完成后,事务回调被调用。该回调具有对变量 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
        });
    });
});