是否可以生成一个web工作程序,并以某种方式从父线程向其注入JavaScript函数?也就是说,不必让工作程序包含一个文件,而是希望父级以某种方式注入它。
一个选项是通过常规通道发送函数代码,并使用构造函数new Function()
(或eval()
)重新创建函数。
在这两种情况下,您都应该检查实际传输的内容,以防止安全风险。
主脚本
// your function given as arguments and code
var funktion = {
args: ['a', 'b' ],
source: 'return a + b;'
};
// send it to your worker
worker.postMessage( funktion );
工人
self.addEventListener( 'message', function( msg ){
// build array for constructor arguments
var args = [ null ].concat( fk.a, fk.c );
// create function
var yourFunc = new (Function.prototype.bind.apply(Function, args));
// use yourFunc
});
这使用了Function
构造函数的动态使用,如本答案中所述。
使用eval()
可能更简单,具体取决于函数代码的使用方式:
主脚本
// your function given as arguments and code
var funktion = "function add(a,b){ return a + b; }";
// send it to your worker
worker.postMessage( funktion );
工人
self.addEventListener( 'message', function( msg ){
// create function
var yourFunc = eval( "(function(){ return " + funktion + "; })()" );
// use yourFunc
});