Javascript WebSql变量作用域
Javascript WebSql variables scope
为什么我不能访问事务中的'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
});
});
});
相关文章:
- 当我更新另一个作用域变量时,作用域变量会自动更新
- 如何在隔离作用域指令中访问此作用域变量
- 正在向构造函数添加作用域变量
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- 作用域变量未从状态父控制器继承到子控制器
- 插槽:访问作用域变量
- 在另一个作用域变量中使用AngularJS作用域变量
- 在Angular.js中通过检查作用域变量进行过滤
- 如何更新作为属性传入的作用域变量
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从$http.get调用更新Angular作用域变量
- AngularJS ui路由器:访问子作用域变量
- 访问AngularJS中函数中的作用域变量
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- 修改作用域变量后,未更新作用域绑定
- 控制器作用域变量在刷新之前未加载
- 将Angular作用域变量的字符串描述传递给指令
- 将内部作用域变量绑定到外部“模板”
- 无法在 $.post 回调中设置作用域变量
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量