Javascript,又一个“太多的递归”问题:复仇的邪恶eval()

Javascript, yet another "too much recursion" issue: Revenge of evil eval()

本文关键字:复仇 邪恶 eval 问题 太多的递归 又一个 太多 Javascript 递归      更新时间:2023-09-26

我正在为一个客户做一个项目(一个很老的项目,被复活了)。

当我在Firefox中(在本例中为4.0,但我认为它发生在3中)浏览该项目的其中一个jsp时。在Firebug控制台中出现以下错误:

错误:太多递归
Archivo fuente: 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];,我没有得到预期的结果,错误仍然存在:同一行,相同的消息。

你有什么建议吗?

我将从campo.focus()开始我的调查。我将在每次调用campo.focus()之前放一个警报,并检查警报是否被多次调用。如果是这种情况,您将需要考虑在何处调用givefocustocontrol()方法。这个方法中的eval调用实际上是不必要的。如果不玩代码,我会说第一个eval可以用forma.controls[nombeControl];代替,我肯定要玩第二个调用,以获得最好的方法来评估它。if(eval(elemento.length))的目的基本上是测试所讨论的控件是否是一个列表。