Почему я не могу доступ 'я' переменной в сделке?
Вы можете, но оно не будет иметь ожидаемого значения. Обратный вызов транзакции называется позже, когда цикл завершен. Этот обратный вызов имеет постоянную ссылку на переменную i
, а не копию ее значения при создании обратного вызова и поэтому он видит i
со значением data.length
. И вы получите undefined
за 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
});
});
});
Что такое вывод console.log (данные)? –
Из-за [этого] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example). – Vidul
распечатывает массив данных с содержимым – user2598369