JavaScript acrobatics:如何将对象文字分配给eval-uated属性?

时间:2010-11-11 17:08:31

标签: javascript

来自Original code

JamieMThomas,一个(尝试将Microsoft JQuery模板和链接结合起来的好人):

mapping[binding.field] = {
    convert: function (value, source, target) {
        if (binding.converter && binding.converter.convert) {
            value = binding.converter.convert(value, source, target)
                if (value === undefined)
                    return;
        }
        $(target).attr(attrName, value);
    }
};

我试图破解它以允许binding.field使用类似"LPC[0].itemid"的字符串(字面意思是字符串)。我使用eval作为一个可怕的选择,但这是我能做的最快的事情(并将在以后重写)。我最初尝试将内容分配给eval('')本身,但它不允许我。

eval('(mapping.' + binding.field + ')') =
    { // rest is the same
    convert: function (value, source, target) {
        if (binding.converter && binding.converter.convert) {
            value = binding.converter.convert(value, source, target)
                if (value === undefined)
                    return;
        }
        $(target).attr(attrName, value);
    }
};

显然左侧的作业无效。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:3)

您可以将整个作业放在eval

eval('mapping.' + binding.field + ' = { ... }');

这将是一个包含函数定义
的非常大的字符串 要使字符串更小,可以将函数放在外部变量中:

var converter = function (value, source, target) {
    if (binding.converter && binding.converter.convert) {
        value = binding.converter.convert(value, source, target)
            if (value === undefined)
                return;
    }
    $(target).attr(attrName, value);
};
eval('mapping.' + binding.field + ' = { convert: converter }');