使用eval将变量分配给方法.否则我该怎么做

Using eval to assign a variable to a method. How else should I do it?

本文关键字:方法 我该怎么做 分配 eval 变量 使用      更新时间:2023-09-26

我正在使用一个方法来接受元素ID的一部分,并使用它来确定需要传递给方法的url路径。在我的情况下,这是由按钮上的点击事件使用的,该按钮可以连接到多个网格中的任何一个,所以我需要知道我在哪个网格上,才能知道要重新加载什么数据:

jQuery('.reset').click(function(e) {
    e.preventDefault();
    jQuery('#' + grid_id + '_mnf').toggle();
    jQuery('#' + grid_id + '_mnfall > .instance').each(function () {
        jQuery(this).removeAttr("checked");
    });
    var url = eval(grid_id + '_url');
    jQuery('#foo').setGridParam({url:url}).trigger('reloadGrid');
});

可能的url被定义为变量,所以我有这样的东西:

var foo_url = url_path + '?input=moduleone&param=1';
var bar_url = url_path + '?input=moduleone&param=2';

这意味着在上面的setGridParam方法中,url值将是这些变量之一。如果我只是这么做:

var url = grid_id + '_url'; //note I'm not using eval here

传递给setGridParam的值将不起作用。

如果我不像上面那样使用eval,url将不起作用。为什么?这是怎么回事?既然"eval是邪恶的",我还应该做什么?

在我看来,在不使用eval的情况下,我传递的url如下:

jQuery('#foo').setGridParam({url:foo_url}).trigger('reloadGrid'); 

但这失败了,所以这里显然需要eval?


因为我确信这是一种过于死板和笨拙的方法,以防有人想看它(并可能暗示我是怎么做错的?),以下是我如何获得grid_id:

// ex. id='foo_filter'
var source = $(this).parent().parent().attr('id').split('_');
var parsed_source = source.splice(1, source.length + 1);
grid_id_portion = '';
for (var i = 0; i < parsed_source.length; i++) {
    grid_id += parsed_source[i];
    if(i < parsed_source.length - 1){
        grid_id += '_';
    }
}

我看到的一些问题。。。我必须将url定义为每个网格的变量。这很不灵活,是吗?这些url也非常相似,所以定义一堆url似乎效率很低。此外,如果有人制作了一个特殊的代码块来插入,作为我要分解的ID传递给eval,该怎么办。这可能是个坏消息,是吗?任何关于如何改进这一点的建议都将不胜感激。

使用映射来存储URL,而不是本地变量。

var URLs = {
    foo: url_path + '?input=moduleone&param=1',
    bar: url_path + '?input=moduleone&param=2'
};
jQuery('.reset').click(function() {
    //do stuff...
    var url = URLs[grid_id];
    jQuery('#foo').setGridParam({url:url}).trigger('reloadGrid');
});