什么';firefox组件中的javascript功能范围是什么?

什么';firefox组件中的javascript功能范围是什么?,javascript,firefox-addon,xpcom,Javascript,Firefox Addon,Xpcom,我正在使用javascript制作firefox组件。 但我总是对当前javascript函数的全局范围感到困惑,这导致了以下问题 我了解一些关于js函数全局范围的基本概念,但我想知道,函数的全局范围是什么时候确定的?创建(定义)函数的时间,还是调用函数的时间 是否有方法显示(打印一些信息)javascript函数的当前全局范围 以下问题是特定于firefox组件的 对于firefox组件,每个组件本身是否都有一个全局范围?(这意味着组件的每个功能都将在其自身的全局范围内运行),或者每个组件都具

我正在使用javascript制作firefox组件。
但我总是对当前javascript函数的全局范围感到困惑,这导致了以下问题

  • 我了解一些关于js函数全局范围的基本概念,但我想知道,函数的全局范围是什么时候确定的?创建(定义)函数的时间,还是调用函数的时间

  • 是否有方法显示(打印一些信息)javascript函数的当前全局范围

    以下问题是特定于firefox组件的

  • 对于firefox组件,每个组件本身是否都有一个全局范围?(这意味着组件的每个功能都将在其自身的全局范围内运行),或者每个组件都具有相同的全局范围?
    如果相同,那是什么

  • 例如,在这种情况下
    对于这个无聊的例子,我很抱歉,我只是尽可能把它说清楚。

    我通过
    Components.utils.sandbox()
    创建一个沙盒。我在ff组件中定义了一些函数(我称之为
    ),并通过以下方式向沙盒中注入变量:
    sandbox.external=this(“这”只是一个组件本身,它位于scope2中)
    在这些步骤之后,我通过
    Components.utils.evalInSandbox(
    ,sandbox)在sandbox中运行一些代码
    包含调用
    外部.foo()的
    函数sandboxFoo()

    1) 。运行时,
    sandboxFoo
    的全局范围是什么?我想应该是这样

    2) 。当被
    sandboxFoo
    调用时,
    external.foo
    的全局范围是什么?是
    还是
    ?有文件吗

  • 定义函数时,将建立作用域
  • 对不起,我不知道
  • 范围取决于覆盖的内容。如果两个组件覆盖同一元素,则它们具有相同的范围
  • 全局范围将是定义它的范围
  • 定义函数时,会计算出函数的全局范围。对于组件,全局作用域与文件中的所有内容共享(大多数情况下,每个文件只有一个组件,因此组件可以有效地获得自己的全局作用域)
  • 这实际上取决于您想知道什么,以及如何调用函数
  • XPCOM组件的全局范围将是它在其中定义的文件。如果文件中定义了多个组件(不常见),则它们将共享相同的全局范围
  • 我想你的意思是在沙箱中运行代码时的全局范围是什么(你的问题很模糊,但如果我错了,我可以修改)。创建沙盒时,它会为沙盒创建一个新的全局范围
  • 这有点复杂。当您分配它时,它是对该指向的任何内容的引用。假设
    this
    是组件的全局范围(它可能不会像编写的那样),并且您的意思是从沙箱中调用
    external.foo
    ,那么全局范围将是组件的全局范围

  • 你真的是指一个组件还是一个JavaScript模块?我指的是一个用JavaScript编写的XPCOM组件。非常感谢,如果在定义函数时建立了js函数全局范围,我可以理解很多。我指的是不覆盖任何内容的XPCOM组件。那么,问题3呢?嗯,看起来您必须使用wrappedJSObject访问组件中的变量。这表明整个范围是隔离的,因此组件有自己的全局对象。不过我只是猜测,我还没有测试过。组件没有覆盖任何内容,所以您的第三个答案有点奇怪。是否可以引用组件中的全局对象(就像您在浏览器中使用
    窗口
    的方式)?该宿主对象是否有任何属性?您可以为其添加自己的全局变量,但不能自动定义。除非代码作为对象方法调用,“this”默认情况下将引用全局范围。但是,它是一个组件,因此很可能作为对象方法调用。对于问题4-2,我的意思是“this”指向组件本身,在组件构造函数中赋值,如this.wrappedJSObject=this;所以答案应该是,即使组件中定义的函数在沙盒中调用,该函数的全局范围将在组件本身中,而不是沙盒中,这也证明了js函数的全局范围是在定义时建立的,而不是在调用时建立的。