我有一个配置,我想在其中确定一个函数,以便稍后在某些代码中使用:
get_config = () ->
{
"function" : (stuff) ->
stuff + "more stuff"
}
此代码在某处被调用,配置以 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)
我最终得到一个如下所示的 json 对象:
{ 'function' : 'function (stuff) {return stuff + "more stuff"}' }
但是,我想不出一个好的方法来稍后加载这个函数。
loaded_function = eval(config['function'])
导致错误“意外的 token (”,我觉得好像有更简洁的方法可以做到这一点。有什么想法吗?
最佳答案
如果配置 JSON 存储为静态文件并反复使用,一个干净的解决方案是简单地从 JSON 中的函数周围删除引号,然后执行此操作:
var get_config = eval("(" + json_data + ")");
JSON 需要用括号括起来才能计算,这就是您收到错误的原因。如果配置 JSON 经常需要被字符串化,那么还有几个其他选项。您可以这样做来调用函数:
var get_config = eval("(" + json_data + ")");
eval("(" + get_config.afunction + ")")("this is passed to the function");
或者您可以使用 JSONfn 插件 ( http://www.eslinstructor.net/jsonfn/ ) 对 JSON 而不是您正在使用的函数进行字符串化,然后像上面那样评估它。 JSONfn 插件能够像您需要的那样序列化函数。
这里有一个 jsFiddle,它显示了上面正在使用的代码:http://jsfiddle.net/4UP53/
关于javascript - 在 json 中存储函数 [Javascript/Coffeescript],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23685210/