“eval是邪恶的”,但我有选择吗?

时间:2011-11-17 09:24:03

标签: javascript eval

我为我正在开发的项目提出了一些自定义本地化解决方案。我的想法是我的HTML可以包含这个:

<h2 data-l10n="HELLO" data-l10n-params="['Visitor', new Date()]"></h2>

当页面启动时,这样的javascript函数运行:

localizeAll: function(sel) {
    var selector = sel || document,
        $o = $(selector);

    $o.find('[data-l10n]').each(
    function() {
        var $t = $(this),
            val = $t.attr('data-l10n'),
            params = $t.attr('data-l10n-params'),
            po = null;

        if (typeof params !== 'undefined') {
            po = eval(params);
            log(params, po);
        }

        var res = doLocalize(val, po);

        if (res[0] !== '<') {
            $t.text(res);
        } else {
            $t.text(val);
        }
    });

}

所以基本上我们搜索具有data-l10n - 属性的任何元素,并为每个对象调用doLocalize()。此外,该元素可以具有data-l10n-params - 属性,该属性只是可以解析为数组的字符串文字。评估此字符串(params字符串变为po数组),po作为可选的第二个参数提供给doLocalize()

因此,Firebug中的输出(来自log(params, po);语句)是:

['Vistor', new Date()] ["Vistor", Date {Thu Nov 17 2011 10:10:31 GMT+0100 (CET)}]

是的,我正在使用eval。是的,我知道“eval是邪恶的”。但偶尔,我需要将参数传递给doLocalize()

如果没有eval,怎么办呢?

2 个答案:

答案 0 :(得分:4)

我认为您的问题是您实际上是在JavaScript中嵌入JavaScript(这违反了unobtrusive JavaScript原则)。

在我的位置,我会添加一个额外的l18n-params.js文件,其中包含以下内容:

var dataL10Nparams = {
    HELLO = ['Visitor', new Date()]
}

现在不是从HTML属性中读取params而只是评估调用:

dataL10Nparams['HELLO']

答案 1 :(得分:2)

如果您只在HTML属性中提供参数化值,请考虑使用JSON.parse()而不是评估。