为什么函数不可序列化?

day*_*oli 0 javascript serialization function argument-passing meteor

背景

在Meteor文档中Meteor.call(),它显示:

如果你包含一个回调函数作为最后一个参数(它不能作为方法的参数,因为函数不可序列化)...

我运行了类似于Meteor.call('name', function() {console.log('abc');}, function() {})之前的东西,其中function() {console.log('abc');}作为参数传入,而empty function() {}用作异步回调的存根.它有效.

那个声明告诉我我不应该将任何函数作为参数传递给函数,或者只应用于回调函数.

在任何一种情况下,为什么该函数不可序列化?我的浅层理解只是一个可序列化的对象,你可以把它变成一个位序列(1's 0' 和's'),因为所有数字都是位序列,我不明白为什么函数不可序列化.

我找到了一些解释,但它们都与Java有关,对于那些还不知道序列化重要性的人来说,它并没有多大帮助.

为什么函数不可序列化?(它与它有什么关系Meteor.call()?)

Fel*_*ing 7

在大多数情况下,可序列化意味着您可以将某些内容转换为与语言无关的表示形式,并在其他位置重建原始状态.例如,数组[0,1,2]可以序列化为JSON "[0,1,2]"并在其他地方反序列化.

在任何一种情况下,为什么该函数不可序列化?

函数对象(在JS中)由两部分组成:它的主体(代码)和它所定义的环境.每个函数都是一个闭包.获取函数的来源很简单,但是无法获得其环境的状态.

例:

var foo = 42;
function bar() {
    console.log(foo);
}

thirdService(bar);
Run Code Online (Sandbox Code Playgroud)

thirdService我不知道定义函数的环境.它所能做的只是得到函数体的字符串表示,但它不知道函数的值foo.

  • @dayuloli:不是 JSON,但您可以拥有自己的格式。如果您只有 JS 到 JS 的通信,那么您可以将函数转换为字符串并对其进行“评估”。但是如果你在语言之间进行通信,那就更难了(也许不可能,你会如何将一个 JS 函数反序列化为一个 Python 函数?)。 (2认同)