Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在json[Javascript/Coffeescript]中存储函数_Javascript_Json_Coffeescript - Fatal编程技术网

在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是以编程方式更新的吗?还是静态的?