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
});
});
});
为什么我无法在事务中访问 '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
});
});
});