我正在做一个 chrome 扩展——我如何将一个函数从后台传递给一个内容脚本实例,显然该函数需要被序列化?
执行 eval(function_string) 可以吗?
这是我第一次练习这种巫术,请帮助。
我正在做一个 chrome 扩展——我如何将一个函数从后台传递给一个内容脚本实例,显然该函数需要被序列化?
执行 eval(function_string) 可以吗?
这是我第一次练习这种巫术,请帮助。
这是我用来实现此目的的代码:
包含要发送的函数的自定义脚本语言脚本:
// An example script
// Showing how dependent functions are defined later on
// With functions that have no dependencies grouped together in an associative array
// preceding, in the execution_context_loader's list, the functions that depend on them.
var collection_script.execution_context_loader = [
{
fa:function(a) { return a+1; },
fb:function(b) { return b*2; },
fc:function(c) { return c-3; }
},
{
fabc:function(a,b,c) {
return window.qwontical.execution_context.fa(a)^
window.qwontical.execution_context.fb(b)^
window.qwontical.execution_context.fc(c);
}
}
];
var script_point = {
name : 'alpha',
source : '/root/space',
data_args : [ '/j1', '/j2', '/j3' ],
function_applied : 'fabc'
};
当在另一边执行时(例如通过调用某个函数execute("alpha");
),会将函数 fabc(序列化和恢复)应用于在/root/space/j1
、 和.../j2
处找到的资源.../j3
。
在功能发送端:
// Function to package a script's execution context for dispatch to a collection script
function package_script_for_dispatch( collection_script ) {
console.log(collection_script);
if ( !!collection_script.execution_context_loader ) {
for ( var i = 0; i < collection_script.execution_context_loader.length; i += 1) {
for ( var func_def in collection_script.execution_context_loader[i] ) {
collection_script.execution_context_loader[i][func_def] = collection_script.execution_context_loader[i][func_def].toString();
console.log("Packed : " + collection_script.execution_context_loader[i][func_def]);
}
}
} else {
collection_script.execution_context_loader = {};
}
}
在函数接收端:
for( var i = 0; i < collectionscript.execution_context_loader.length; i+= 1) {
for (var func_name in collectionscript.execution_context_loader[i] ) {
var func_def_string = collectionscript.execution_context_loader[i][func_name];
console.log("About to revivify " + func_name + " : " + func_def_string);
eval("window.qwontical.execution_context['"+func_name+"'] = "+func_def_string);
}
}
这样一个函数的调用约定是
window.qwontical.execution_context[func_name](args...);
这使得函数可以在脚本中通过它们的名称定义,然后在脚本被序列化和“复活”之后使用