Ну, простыми словами:
Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.
Итак, как это решить:
if (i == null) {
// Handle this
}
Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);
Да, это проблема масштаба. Вы забыли поставить var
перед всеми переменными. Это делает переменные глобальными, то есть каждый вызов функции имеет доступ к тем же переменным (и переписывает их).
См. Исправленную версию: http://jsfiddle.net/fkling/uYXYh/
Вы могли бы улучшить код, используя больше методов jQuery:
function buildList(point) {
if (!point) return [];
var children = [];
point.children('li').each(function() {
var parts = this.id.split('-');
var newObj = {
id: parts[1],
mtype: parts[0],
label: $(this).children('div').text()
};
var $ol = $(this).children('ol');
if ($ol.length == 1) {
newObj['childobjects'] = buildList($ol);
}
children.push(jQuery.extend(true, {}, newObj)); // not sure why you are
// doing this instead of
// children.push(newObj)
});
return children;
}
Похоже, что index
объявляется глобальной переменной и получает мутацию при каждом вызове buildList. Я думаю, что это ваша проблема (но, возможно, вы делаете это специально для чего-то, чего я не вижу). Попробуйте изменить свой оператор for:
for(var index=0; index < lis.length; index++){
// ...
}