Javascript 将函数对象从一个窗口复制到另一个窗口

Javascript 将函数对象从一个窗口复制到另一个窗口,javascript,Javascript,在Javascript中,是否可以将函数或任何对象从一个窗口上下文复制到另一个窗口上下文 假设我有一个带有框架的父窗口。框架定义了一个函数foo,我想把它复制到外部窗口。这样做的一个原因是,当框架文档导航到不同的URL时,foo是可用的 我知道我可以通过执行以下操作在父对象中轻松创建对foo的引用 但是使用此方法,foo仍然存在于框架文档中,并且如果框架被卸载,父级将无法使用它 我知道我也可以使用函数构造函数在父函数中创建新函数: parent.foo = new parent.Function

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

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

我知道我可以通过执行以下操作在父对象中轻松创建对foo的引用

但是使用此方法,foo仍然存在于框架文档中,并且如果框架被卸载,父级将无法使用它

我知道我也可以使用函数构造函数在父函数中创建新函数:

parent.foo = new parent.Function(" ... ");
但是,这要求我将函数作为JS字符串


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

您总能获得调用其toString方法的给定函数的代码:


虽然我不确定它是否在所有浏览器中都可用,但我认为我已经看到它在主流浏览器、现代版本中都可以使用。

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

只在父级中编写javascript函数不是更好吗?框架将始终具有访问父框架的权限。这样,您可以在父级或帧中使用该函数。还是我误解了?理论上这是可能的,但我的情况有一些限制。特别是,我的脚本有时会包含在框架文档中,我不想限制人们这样做。@levik:只需在父级中使用该函数,并将其拉入框架中,而不是推送到父级。这样,如果框架卸载,父对象的副本仍然有效。toString返回函数{…},因此这不会发生
  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);