Javascript, еще одна проблема "слишком много рекурсии": Месть зла eval () - PullRequest
1 голос
/ 12 апреля 2011

Я работаю над проектом (очень старый, который был восстановлен) для клиента.

Когда я просматриваю одну из JSP проекта в Firefox (в данном случае 4.0, но я полагаю,это также происходит с 3.x), на консоли Firebug появляется следующая ошибка:

Ошибка: слишком много рекурсии
Архивация: https://localhost:9443/ClientProjectWeb/js/Object.js
Линия: 226

Вот фрагмент кода этой строки:

if(gControl){giveFocusToControl(gControl.name);}

Это вызванная функция:

function giveFocusToControl(nombreControl){
    var forma = document.forms[0];
    var campo = null;
    if(forma){
        var elemento = eval("forma."+nombreControl);
        if(eval(elemento.length)){
            if(elemento.type == "select-one" || elemento.type == "select-multiple"){
                campo = elemento;
            }else{
                campo = elemento[0];
            }
        }else{
            campo = elemento;
        }

        if(campo.style && campo.style.visibility){
            if(campo.style.visibility != "hidden"){
                campo.focus();  
            }
        }else{
            campo.focus();          
        }
    }
}

Я подозреваю, что это связано с eval() вызовами внутрифункция, но, несмотря на то, что я пытался заменить эти «злые» вызовы альтернативой [], предложенной в этом документе , например: var elemento = forma[nombreControl];, я не получил ожидаемого результата, ошибка по-прежнемутам: та же строка, то же сообщение.

У вас есть предложения?Заранее спасибо.

1 Ответ

2 голосов
/ 12 апреля 2011

Campo.focus () - это то место, где я бы начал свое расследование.Я бы поставил предупреждение перед каждым из всех в campo.focus () и проверил, вызывается ли предупреждение несколько раз.В этом случае вам нужно будет рассмотреть, где вызывается метод giveFocusToContol ().В этом методе вызовы eval на самом деле не нужны.Не играя с кодом, я бы сказал, что первый eval можно заменить на forma.controls[nombeControl];. Мне определенно придется поиграть со вторым вызовом, чтобы получить лучший способ его оценить.Цель if(eval(elemento.length)) в основном состоит в проверке, является ли рассматриваемый элемент управления списком.

...