是否可以在不使用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对象。
答案 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没有内置函数类型。
您的选择:
myObject[function_name_as_string_from_json](foo, bar)
答案 2 :(得分:0)
不是以任何直截了当的方式。想象一下可能会做任何算法。然后,算法将没有直接的方法来区分这些数据:
foo1 = {"x": "someFunc(foo2.x)"};
foo2 = {"x": "someFunc(foo1.x)"};
function someFunc(var1) {
return (var1 + 1);
}
很难想出一种能够阻止这种无限循环的算法,或者是一种不那么直接的循环算法。