Пожалуйста, извините за неуклюжее название, я постараюсь изо всех сил объяснить мою странную проблему.
У меня есть три бита кода JavaScript:
- Некоторый самоисполняющийся код, который вызывает мою личную функцию Ajax и передает ей обратный вызов.
- Сама функция ajax, которая извлекает данные, вызывает функцию обратного вызова, передавая ей данные.
- Сам обратный вызов, который принимает данные и анализирует их в массив длиной n .
Что следует отметить, так это то, что сам исполняемый код и функция обратного вызова определены в их собственном замыкании. Доступ к функции ajax осуществляется через импортированное именованное замыкание, которое я определил как $ .
Я довольно новичок в JavaScript и все еще изучаю замыкания и их области применения. У меня есть основания полагать, что эта проблема, вероятно, связана с этим.
В любом случае, моя проблема связана с попыткой доступа к этому якобы заполненному массиву. Поскольку я определил массив в подходящей области видимости (или, как я полагаю) в качестве функции синтаксического анализа, я думаю, у меня не должно возникнуть проблем с добавлением в него элементов.
Это самоистребовавшееся:
(function ($){
//Load stock
var items = [];
var response = $.Ajax("scripts/Lookup.php","GET",parse);
function parse(a){
for(/*Simplified view*/){
var item = new $.Item();
item.name = domStuff.textContent;
item.description = domStuff.textContent;
item.price = domStuff.textContent;
item.id = domStuff.textContent;
items.push(item);
}
}
//Test the length (and verify contents)
for(var i=0; i < items.length; i++){
alert(items[i].price);
}
}($));
Это мои определения, которые включают в себя функцию Ajax:
var $ = (function(){
var s = {};
var ajax = function(url,method,callback){
var a = new XMLHttpRequest();
a.open(method, url, true);
a.onreadystatechange = function(){
if(this.readyState==4){
callback(a);
}
}
a.send();
};
s.Ajax = (function(){
return ajax;
}());
return s;
}());
Итак, что оправдывает заголовок, так это то, что когда я проверяю код с помощью firebug, я вижу, что items заполнен 3 объектами, правильно определенными проанализированными данными.
Затем цикл предупреждает 3 раза.
Однако, если я удаляю точки останова, а firebug игнорирует код, цикл не воспроизводится, и я могу только предполагать, что массив пуст.
Код работает также, если я предупреждаю (элементы) до цикла проверки.