将功能对象从一个窗口复制到另一个窗口

时间:2009-03-24 20:28:36

标签: javascript

是否可以在Javascript中将函数(或任何对象)从一个窗口上下文复制到另一个窗口上下文?

假设我有一个带有框架窗口。 框架定义了一个函数foo(),我想复制到外部窗口。 (这样做的一个原因是当框架文档导航到不同的URL时foo()可用。)

我知道我可以通过

轻松地在中为foo()创建参考
function foo() { ... }    
parent.foo = foo;

但是使用此方法foo()仍然存在于框架文档中,并且 将无法使用框架卸货。

我知道我也可以使用Function构造函数在 parent 中创建一个新函数:

parent.foo = new parent.Function(" ... ");

然而,这要求我将我的功能作为JS字符串。

DOM支持通过importNode()将节点从一个文档移动到另一个文档。 Javascript是否有类似的功能?

2 个答案:

答案 0 :(得分:1)

虽然需要做更多的工作,但是nitko的解决方案似乎是正确的。此功能似乎适用于FF2,FF3,IE7和Chrome:

  function importFunction(fn, win) {
    var code = fn.toString();
    var params = code.match(/\(([^)]*)\)/);
    if (typeof(params[1]) !== 'undefined') {
      params = params[1].split(/\s*,\s*/);
    } else {
      params = null;
    }
    code = code.replace(/^[^{]*{/, '');
    code = code.replace(/}$/, '');
    if (params) {
      return new win.Function(params, code);
    } 
    return new win.Function(code);
  }

返回的函数可以在所需的窗口中使用。类似的东西:

parent.foo = importFunction(foo, parent);

答案 1 :(得分:-1)

您始终可以获取给定函数的代码,调用它的toString()方法:

parent.foo = new parent.Function( originalFunction.toString() );

虽然我不知道它可以在每个浏览器中使用,但我认为我已经看到它在主流浏览器,现代版本中工作。