javascript - 在 json 中存储函数 [Javascript/Coffeescript]

标签 javascript json coffeescript

我有一个配置,我想在其中确定一个函数,以便稍后在某些代码中使用:

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/

相关文章:

javascript - 按特定规则用JavaScript重构JSON

ios - 解析 JSON Swift

syntax - CoffeeScript 中无缓冲的多行注释?

ruby-on-rails - 将参数从 Angular 传递到 Rails

javascript - 将两个动态键分配给数组

javascript - 如何更有效地查看数组? Javascript

javascript - 是什么让网格线可见?

java - 从复杂的 JSON 数据创建 Hashmap

javascript - 在 Angular 2 项目中添加 .js 脚本

javascript - 将简单数组转换为二维数组(矩阵)