2013-03-06 59 views
0

是否有可能做这样的事情,而不使用eval?添加功能,JSON不使用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

为什么不把它包又一想函数内'{“x”:功能on(){someFunc(foo1.x); }}' – 2013-03-06 15:40:52

+1

@Салман - 这是无效的JSON。 – Quentin 2013-03-06 15:41:31

+0

它需要是JSON还是只是一个JavaScript对象? – 2013-03-06 15:41:58

回答

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。

如果你是

+2

你应该明白你从来没有用JSON合作,开始..你正在使用Javascript对象初始化其中*看起来像* JSON,但并非如此。 – Esailija 2013-03-06 15:57:44

+0

原始代码是 '变种foo1 = {X:4};'' 变种foo2的= {X:someFunc(foo1.x)};'' 功能someFunc(VAR1)'' {'' 返回(var1 + 1);' '}' 'alert(foo1.x); // 4' 'alert(foo2。X); // 5(希望)' 但编辑后的代码不适用于我,也再次使用括号。 – wubbewubbewubbe 2013-03-06 16:07:40

+1

对不起,放错了分号。现在修复。如果它也适合您,请随时使用原件。 – 2013-03-06 16:59:05

1

JSON没有内置函数类型。

您的选择:

  • 的eval(这是邪恶的)
  • 预载功能,您到您的网页(例如作为对象的方法),然后通过在JSON的函数的名称。 (您可以再调用myObject[function_name_as_string_from_json](foo, bar)
  • 写DSL和JS解析器(如果你的函数简单的方式会发生变化)
+0

该操作实际上只是谈论JavaScript和JavaScript对象文字 – Esailija 2013-03-06 15:43:48

+0

@Esailija - 我不太确定。所有关于'eval'的讨论都让我认为给出的代码是一个简化的例子,它可以切断获取和解析JSON的过程。 – Quentin 2013-03-06 15:44:54

+0

我不知道,“JSON对象”一如既往地为我设置了警报。 – Esailija 2013-03-06 15:55:34

0

不以任何直接的方式。试想一下,可能会做任何算法。那么就是算法的区分这个数据没有简单明了的方式:

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

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

这是很难拿出一个算法,将停止这个无限循环,或者不那么直接的一个

+2

这不是一个答案。这实际上是一个问题。 – Manuel 2013-03-06 15:45:31

+0

@ dragon112:这些问题当然是修辞的。尽管如此,我编辑的目的是改变从问题到陈述的语气。但内容仍然相同;我的回答是,没有合理的方法来做到这一点。我可以想出可能看起来有效的黑客攻击,但是我可以轻松想出可能会破坏它们的场景。 – 2013-03-06 15:55:03

+0

我同意你的观点,而不是它之前写下来的。 – Manuel 2013-03-07 12:49:04