0

是否可以在不使用 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 对象。

4

3 回答 3

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。

于 2013-03-06T15:42:01.740 回答
1

JSON 没有内置的函数类型。

您的选择:

  • eval(这是邪恶的)
  • 将您的函数预加载到您的页面上(例如,作为对象上的方法),然后在 JSON 中传递函数的名称。(然后您可以调用myObject[function_name_as_string_from_json](foo, bar)
  • 为它编写一个 DSL 和一个 JS 解析器(如果你的函数以简单的方式变化)
于 2013-03-06T15:43:08.930 回答
0

不是以任何直接的方式。想象一下任何可能做到这一点的算法。那么算法就没有直接的方法来区分这些数据:

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

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

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

于 2013-03-06T15:44:29.913 回答