Javascript: заменить Eval () и проблема длины объекта неопределена - PullRequest
0 голосов
/ 20 июня 2010

Вот моя урезанная функция для повторения через структуру dom браузеров.

(function () {
    function displaydom (child, parent) {
        if (parent) {parent = parent+".";}; // if there is no parent then child is the parent

        var jsns = eval(parent+child); // Join parent + child and eval

        for (var i in jsns){ // loop through dom object's attributes
            if (typeof jsns[i] == "object") { // if attribute is an object then recurse through
                // display output here
                displaydom (String(i) /** next child **/, parent+child);
            };
        };
    };
    displaydom ('self', '');
})();

Есть пара проблем, вероятно, простых, с которыми я не смог добраться до работы (в Chrome):

  1. нужно удалить eval ()
  2. Я хочу изменить цикл for на for (var i=0, len = jsns.length; i < len; i++) {};, потому что он быстрее, но я продолжаю получать длину для jsns '0' или 'undefined'.

P.S. - Не пытайтесь запускать код как есть, если только вы не хотите, чтобы ваш браузер зависал!

Ответы [ 2 ]

1 голос
/ 20 июня 2010

Использование квадратная скобка

        var jsns = parent[obj]

Что касается вашего второго вопроса…

1. `parent` - пустая строка. 2. Строки не имеют свойства self 3. Следовательно, `" ".self` является` undefined` 4. `undefined` не имеет свойств, поэтому не может иметь свойства длины

… вы не можете использовать tranditional for loop для чего-то, что не является массивом (или объектом, похожим на массив), и большинство объектов не являются.

0 голосов
/ 20 июня 2010

Чтобы удалить eval , вы можете использовать квадратные скобки, как сказал Дэвид:

var jsns = parent;
if(parent) { 
    jsns = parent[child]; 
}

Вы не можете изменить цикл , потому чтоне перебирайте свойства объекта так, как вы предлагаете.Свойства объекта могут быть доступны только по имени, они не индексируются численно.Единственный способ сделать это - цикл for-in, который вы сейчас используете.

...