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()?)
在大多数情况下,可序列化意味着您可以将某些内容转换为与语言无关的表示形式,并在其他位置重建原始状态.例如,数组[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.