将函数对象引用传递为序列化的json

时间:2013-07-29 20:07:59

标签: javascript jquery-ui-widget-factory

我使用jquery小部件工厂编写了一些小部件。通常,我使用JavaScript代码块中的小部件构造函数传递选项和回调引用。

现在我想在自动生成的html页面中使用小部件,并在不使用JavaScript块的情况下将选项传递给它们。我在嵌入式json中指定了一个常见的JavaScript代码块解析并将其传递给小部件的选项。

<div id="search_widget">
    <script type="application/json">
    {
        "search": {
            "search_string": "text to be searched",
            "callback": "a function object in an outer scope"
        }
    }
    </script>
</div>

如何将保留其范围的函数对象传递给json格式的小部件? 然后,小部件将在满足条件时调用指定的函数。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以将函数体作为文本传递,但您的接收上下文必须知道它是一个函数,并使用Function构造函数(或其他东西)“重构”它。你不能保留“范围”,尽管这在JSON块中并没有多大意义。

您还可以传递函数名称,某些识别模式或您喜欢的任何其他内容,但所有条件都是接收代码知道如何对其进行操作。

JSON没有提供表示“功能”的机制。这个概念与格式完全不同,这是正确的,因为它的目的是与语言无关。

编辑 - 请注意,如果您按名称对函数进行编码:

<script type="application/json">
{
    "search": {
        "search_string": "text to be searched",
        "callback": "search_callback_23"
    }
}
</script>

然后抓取对象并解释内容的代码总是可以使用外部JSON对象作为上下文来调用该函数:

function handleJSON( the_JSON_from_the_example ) {
  var json = JSON.parse(the_JSON_from_the_example);
  if ("search" in json) {
    var searchTerm = json.search.search_string;
    var callback = findCallbackFunction(json.search.callback); // whatever 
    callback.call(json, searchTerm); // or json.search maybe?
  }
}

换句话说,如果解释JSON编码信息的代码知道足以找到回调函数引用,那么它可能会在调用函数时找出一个适当的对象用作this