在json[Javascript/Coffeescript]中存储函数
我有一个配置,我想在其中确定一个函数,以便稍后在某些代码中使用:在json[Javascript/Coffeescript]中存储函数,javascript,json,coffeescript,Javascript,Json,Coffeescript,我有一个配置,我想在其中确定一个函数,以便稍后在某些代码中使用: get_config = () -> { "function" : (stuff) -> stuff + "more stuff" } 这段代码在某个地方被调用,并且使用以下helper函数将配置作为json存储在一个文件中: stringifyWithFunctions = (object, replacer, spacing) -> strin
get_config = () ->
{
"function" : (stuff) ->
stuff + "more stuff"
}
这段代码在某个地方被调用,并且使用以下helper函数将配置作为json存储在一个文件中:
stringifyWithFunctions = (object, replacer, spacing) ->
stringify_functions = (key, val) ->
if replacer
if typeof val == 'function'
return replacer(key, val.toString())
else
return replacer(key, val)
else
if typeof val == 'function'
return val.toString()
else
return val
return JSON.stringify(object, stringify_functions, spacing)
var get_config = eval("(" + json_data + ")");
eval("(" + get_config.afunction + ")")("this is passed to the function");
我最终得到一个json对象,如下所示:
{ 'function' : 'function (stuff) {return stuff + "more stuff"}' }
但是,我想不出以后加载此函数的好方法
loaded_function = eval(config['function'])
结果出现了一个错误“Unexpected token”(“意外标记”),我觉得可能有一种更干净的方法可以做到这一点。有什么想法吗?如果配置JSON存储为静态文件并反复使用,一个干净的解决方案就是简单地删除JSON中函数周围的引号,然后执行以下操作:
var get_config = eval("(" + json_data + ")");
JSON需要用括号括起来进行计算,这就是为什么会出现错误的原因。如果配置JSON一直需要字符串化,那么还有几个其他选项。您可以这样做来调用函数:
stringifyWithFunctions = (object, replacer, spacing) ->
stringify_functions = (key, val) ->
if replacer
if typeof val == 'function'
return replacer(key, val.toString())
else
return replacer(key, val)
else
if typeof val == 'function'
return val.toString()
else
return val
return JSON.stringify(object, stringify_functions, spacing)
var get_config = eval("(" + json_data + ")");
eval("(" + get_config.afunction + ")")("this is passed to the function");
或者,您可以使用JSONfn插件()来字符串化JSON,而不是您正在使用的函数,并像上面那样对其进行评估。JSONfn插件能够像您需要做的那样序列化函数
下面是一个需要处理的JSFIDLE,它显示了上面正在使用的代码:
函数(…){…}
被eval
视为函数声明,但是(函数(…){…})
被视为一个函数表达式,因此你可以评估后者。是的,我可能应该解释得更多。我写的东西基本上是你的答案加上我的评论,当你的答案出现时。我用注释而不是大部分重复的答案填空。不用担心。这在技术上是正确的,但是我想知道是否有更好的模式来完成我试图做的事情。我想到的最好的方法是在某个地方保留一个潜在函数模块,并将其名称放在配置中。配置JSON是以编程方式更新的吗?还是静态的?