在不使用eval的情况下向JSON添加函数

时间:2013-03-06 15:39:03

标签: javascript json eval

是否可以在不使用eval的情况下制作这样的东西?

foo1 = {"x": 4};
foo2 = {"x": "someFunc(foo1.x)"};

someFunc(var1)
{
    return (var1 + 1);
}

alert(foo1.x); // 4
alert(foo2.x); // 5 (hopefully)

实际上这是两个问题。第一个是获取一个函数来执行,第二个是在没有括号的情况下这样做,因为在循环中我不知道它是foo2.x还是foo2.x()。

我能想到的最好的事情是在JSON对象中搜索表示函数的关键字,并使用切换列表来执行它们,并用值替换关键字。

缺点是我需要在每次更改时更新JSON对象。

3 个答案:

答案 0 :(得分:1)

你只想要一个普通的javascript对象:

var foo1 = {x: 4};
// we make foo2.x a function so it will dynamically update with foo1.x 's value
var foo2 = {x: function(){ 
    return someFunc(foo1.x);}
};

function someFunc(var1)
{
    return (var1 + 1);
}

alert(foo1.x); // 4
alert(foo2.x()); // 5

如果您需要将这些对象作为JSON传递,则可以使用JSON.stringify将对象传递给服务器。

JSON不是动态的,它是传递数据的语言。您应该在操作时将数据表示为对象,然后在需要发送时将其转换为JSON。

如果你是

答案 1 :(得分:1)

JSON没有内置函数类型。

您的选择:

  • Eval(这是邪恶的)
  • 将您的函数预加载到页面上(例如,作为对象上的方法),然后在JSON中传递函数的名称。 (然后您可以拨打myObject[function_name_as_string_from_json](foo, bar)
  • 为它编写一个DSL和一个JS解析器(如果你的函数以简单的方式变化)

答案 2 :(得分:0)

不是以任何直截了当的方式。想象一下可能会做任何算法。然后,算法将没有直接的方法来区分这些数据:

foo1 = {"x": "someFunc(foo2.x)"};
foo2 = {"x": "someFunc(foo1.x)"};

function someFunc(var1) {
    return (var1 + 1);
}

很难想出一种能够阻止这种无限循环的算法,或者是一种不那么直接的循环算法。

相关问题