尝试返回动态变量值时避免Eval()

时间:2016-03-31 00:40:25

标签: javascript

我在IIFE中有一些代码。我有函数if (CreateNoteActivity.didClick) { // User is saving an existing note Note anote = notes.getItem(passedNoteId); anote.setTitle(passedTitle); anote.setDescription(passedDescription); } else { // User is creating a new note notes.add(new Note(passedTitle, passedDescription)); } ,它将动态返回在IIFE中声明的变量的值。我正在寻找使用getValue()的替代解决方案,而无需重新组织变量的数据结构。

注意 - 我试图避免将变量放在对象中(即 - 水果)。

eval()

3 个答案:

答案 0 :(得分:4)

这个怎么样?

(function() {

    var fruit = {
      apple: 'Apples!!',
      banana: 'Bananas!!',
      cucumber: 'Cucumbers!!'
    };

    function getValue(key) {
        return fruit[key]; //can I avoid using eval()?
    }

    console.log(getValue('apple')); //Apples!!

})();

答案 1 :(得分:1)

(function() {

    var fruit = {
        apple: 'Apples!!',
        banana: 'Bananas!!',
        cucumber: 'Cucumbers!!';
    }
    function getValue(key) {
        return fruit[key]; //can I avoid using eval()?
    }

    console.log(getValue('apple')); //Apples!!

})();

答案 2 :(得分:1)

如果您枚举并复制所有有效的变量名称,则可以使用

(function() {

    var apple = 'Apples!!',
        banana = 'Bananas!!',
        cucumber = 'Cucumbers!!';

    function getValue(key) {
        var vals = { apple: apple, banana: banana, cucumber: cucumber};
        return vals[ key];
    }

    console.log(getValue('apple')); //Apples!!

})();

您还可以考虑通过验证参数值来清理eval的使用:

(function() {

    var apple = 'Apples!!',
        banana = 'Bananas!!',
        cucumber = 'Cucumbers!!';

    var publicVars = ["apple", "banana", "cucumber"];

    function getValue(key) {
        if(publicVars.indexOf(key) < 0)
            throw new Error("Invalid variable name for getValue: " + key);
        return eval(key);
    }


    console.log(getValue('apple')); //Apples!!

})();

<小时/> 脚注:以上示例旨在最大限度地降低客户的程序维护成本。不建议使用它们设计新项目,而不是建议的“水果”对象。