0

我正在做一个 chrome 扩展——我如何将一个函数从后台传递给一个内容脚本实例,显然该函数需要被序列化?

执行 eval(function_string) 可以吗?

这是我第一次练习这种巫术,请帮助。

4

1 回答 1

0

这是我用来实现此目的的代码:

包含要发送的函数的自定义脚本语言脚本:

// 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...);

这使得函数可以在脚本中通过它们的名称定义,然后在脚本被序列化和“复活”之后使用

于 2013-03-03T17:30:27.960 回答