【问题标题】:Storing a function in json [Javascript/Coffeescript]在 json 中存储函数 [Javascript/Coffeescript]
【发布时间】:2014-07-04 07:29:39
【问题描述】:

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

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'])

导致错误“Unexpected token (”,我觉得可能有一种更清洁的方法可以做到这一点。有什么想法吗?

【问题讨论】:

    标签: javascript json coffeescript


    【解决方案1】:

    如果配置 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/

    【讨论】:

    • function(...) { ... }eval 视为函数声明,但(function(...){...}) 被视为函数表达式,因此您可以@987654328 @后者。
    • 是的,我可能应该解释更多。
    • 当你的答案进来时,我正在写一些基本上是你的答案加上我的评论的东西。我用评论而不是大部分重复的答案填写空白。不用担心。
    • 这在技术上是正确的,但我想知道是否有更好的模式来完成我想要做的事情。我想出的最好的办法是在某处保留一个潜在功能模块,并将其中一个模块的名称放入配置中。
    • 配置 JSON 是否以编程方式更新?还是静态的?
    猜你喜欢
    • 2016-07-30
    • 2012-07-10
    • 1970-01-01
    • 2017-10-12
    • 2013-01-20
    • 2016-11-26
    • 2014-01-20
    • 2019-08-26
    • 2018-09-09
    相关资源
    最近更新 更多