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

"eval is evil", but do I have an option?

本文关键字:有选择 邪恶 eval      更新时间:2023-09-26

我为我正在做的一个项目想出了一些定制的本地化解决方案。这个想法是,我的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怎么能做到呢?

我认为你的问题是,你有效地嵌入JavaScript在HTML(这是反对不引人注目的JavaScript原则)。

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

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

现在不需要从HTML属性中读取参数并求值只需调用:

dataL10Nparams['HELLO']

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