【问题标题】:Accessing the value of a concatenated variable name访问连接变量名称的值
【发布时间】:2023-03-16 12:00:01
【问题描述】:

问题描述:

我正在尝试简化一些代码,除了我显然只是创建一个字符串而不是访问相应变量的值。如何将 'total_' + animal 转换为变量,然后我可以访问该变量以将结果动态分配给 DIV?

代码:

JS:

function tallyAnimals(animal) {
    total_animal++;
    if (animal == "dog")  { total_dog++;  }
    if (animal == "cat")  { total_cat++;  }
    if (animal == "bird") { total_bird++; }
    if (animal == "fish") { total_fish++; }

    //The problem line
    $('#' + animal).html('total_' + animal);
}

HTML:

<div id="animals">

    <div id="dog">0</div>
    <div id="cat">0</div>
    <div id="bird">0</div>
    <div id="fish">0</div>

</div>

【问题讨论】:

    标签: javascript html variables concatenation


    【解决方案1】:

    您可以使用 eval() 函数。这是解决方案:

    function tallyAnimals(animal) {
        total_animal++;
        if (animal == "dog")  { total_dog++;  }
        if (animal == "cat")  { total_cat++;  }
        if (animal == "bird") { total_bird++; }
        if (animal == "fish") { total_fish++; }
    
        $('#' + animal).html(eval('total_' + animal));
    }
    

    Eval 就是为这种工作而生的!您还可以通过以下方式使用更少的行数:

    function tallyAnimals(animal) {
        total_animal++;
        eval("total_"+animal."++");
        $('#' + animal).html(eval('total_' + animal));
    }
    

    【讨论】:

    • 感谢您的回复。我被告知要不惜一切代价避免使用 eval() 。这是罕见的例外之一吗?
    • 使用 eval 构建变量可能很危险,因为它可能会被恶意使用...您可以在此处阅读更多相关信息:stackoverflow.com/questions/1594023/…
    • 我明白了。我认为除非我完全彻底地理解它,否则我可能应该回避它。尽管您声称这正是它的用途,但这激起了我的好奇心。 :-) 再次感谢您。
    【解决方案2】:

    因为 'total_'+animal 看起来是全局的,没有 eval :

    var function tallyAnimals(animal) {
        total_animal++;
        if (animal == "dog")  { total_dog++;  }
        if (animal == "cat")  { total_cat++;  }
        if (animal == "bird") { total_bird++; }
        if (animal == "fish") { total_fish++; }
    
        //The problem line
        $('#' + animal).html(window['total_' + animal]);
    }
    
    should work
    

    编辑:

    理想情况下,您不应该使用全局变量,并将“total”+动物变量附加到精确的范围内。

    例如:

    文件中函数tallyAnimal之外的某个地方:

    var totals = {
       dog:0,
       cat:0,
       ...
    }
    

    所以你可以写

    $('#' + animal).html(totals[animal]);
    

    【讨论】:

    • 与 eval() 相比,是否更倾向于以这种方式使用全局变量?哪种做法更好?
    • eval 是邪恶的!我的观点是,除非你有一个特定的用例,否则你不应该使用 eval,因为你可以根据变量的范围动态地解析变量名。我并不是说使用全局变量很好,但它比 eval 更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多