确定在JavaScript中调用函数的帧(名称)

确定在JavaScript中调用函数的帧(名称),javascript,Javascript,在提出问题之前,让我先说一个事实,我正在从事一个非常非典型的项目。我不关心安全性或跨浏览器的影响。我正在使用Chromium项目的定制构建 我的问题是,如果我从不同的名称空间调用函数,如何确定原始名称空间 例如,假设我有三个帧: 1. window -> 2. frame1 //is a child of window -> 3. frame2 //is a child of window 现在,让我们假设窗口中的一些JavaScript有一个名为doStuff()

在提出问题之前,让我先说一个事实,我正在从事一个非常非典型的项目。我不关心安全性或跨浏览器的影响。我正在使用Chromium项目的定制构建

我的问题是,如果我从不同的名称空间调用函数,如何确定原始名称空间

例如,假设我有三个帧:

1. window
    -> 2. frame1 //is a child of window
    -> 3. frame2 //is a child of window
现在,让我们假设
窗口中的一些JavaScript有一个名为
doStuff()
的函数,我可以通过以下方式访问
frame1
frame2

var localDoStuff = top.doStuff;
在函数
doStuff
中,我是否可以确定
frame1
frame2
中的哪一个调用它?i、 e:如果我在
frame1
的范围内调用
localDoStuff
,我能在
doStuff
的范围内得到
frame1
的DOM窗口对象吗

如果我使用
arguments.callee.caller
,它会给出调用它的函数的字符串表示形式。但是,我希望得到定义该函数的范围

如果有人对如何修改浏览器以允许这样做有一个好的、直接的想法,我可以访问浏览器的源代码

从评论粘贴:
我基本上是在模拟一个运行多个应用程序的操作系统。这些应用程序中的每一个都是一个iframe,可以访问在应用程序的父框架中定义的API。假设此API具有函数requestFocus()--不允许使用参数,正如我正在实现的API规范中定义的那样。为了给出正确的iframe焦点,我必须知道哪个iframe调用了requestFocus函数。我知道这不是一个理想的情况——不幸的是,我没有编写API规范


感谢您的帮助,我知道这是一个非常奇怪的问题。

一个可能的答案,在参数中传递window对象,您的函数将根据传入的窗口进行操作。如果它们是命名框架,则窗口应具有name属性

编辑:替代解决方案

如果您正在创建iframe,并且希望对iframe中的调用者隐藏requestFocus窗口参数,则可以使用以下技术:

创建iframe后,将包装器requestFocus插入到iframe的窗口中,该窗口将通过它自己的窗口

因此,在为iframe生成内容时,可以在每个iframe中创建如下函数:

function requestFocus() {
  parent.requestFocus(window);
}

就像我说的,我不认为你可以不传递窗口对象,但是你至少可以对调用方隐藏它。而且,仅仅因为您没有编写API,并不意味着您不应该有任何输入。JS不支持您所要求的(自动确定哪个帧调用了我),而且首先听起来像是糟糕的设计

因为不同的帧具有不同的
函数
构造函数,您可能会这样检测:

function doStuff() {
    if (doStuff.caller instanceof Function) {
        // called from top
    } else if (doStuff.caller instanceof frame1.contentWindow.Function) {
        // called from frame1
    } ...
}
但是,如果函数是从顶级代码调用的,则这不起作用,在这种情况下,
doStuff.caller===null


我真的很好奇,想看看是否有人能解决这个问题。

我能想到很多破解方法,但这似乎毫无意义。。。为什么你需要知道哪个帧叫它?如果你需要窗口对象,你应该通过你的调用传递它。嗯,这是个好主意。我应该提到我正在实现一个API,这意味着我不能偏离API规范。不幸的是,我必须坚持一组非常有限的论点。解释一下你为什么想要这种行为,人们也许可以帮助你选择。我基本上是在模拟一个运行多个应用程序的操作系统。这些应用程序中的每一个都是一个iframe,可以访问在应用程序的父框架中定义的API。假设此API具有函数requestFocus()--不允许使用参数,正如我正在实现的API规范中定义的那样。为了给出正确的iframe焦点,我必须知道哪个iframe调用了requestFocus函数。我知道这不是一个理想的情况——不幸的是,我没有编写API规范……替代解决方案肯定是可行的。谢谢你的帮助@BradSwerdfeger我不想选择这个作为正确的答案:
函数。调用方
不是标准的(但它在主要浏览器上工作),Pumba80提到,如果从顶层调用函数,则不会。最重要的是,这取决于谁给你打电话是如此糟糕的设计。这是一个很酷的黑客虽然。