firefox组件中的javascript函数范围是什么?

时间:2011-03-04 07:49:16

标签: javascript firefox-addon xpcom

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

  1. 我理解一些关于js函数全局范围的基本概念,但是我想知道,函数的全局范围何时确定?创建(定义)函数的时间,或调用函数的时间?

  2. 有没有办法显示(打印一些信息)javascript函数的当前全局范围?

    following question is firefox component specific

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

  4. 例如,在这种情况下 sorry for this boring example, i just make it as clear as possible.
    我通过Components.utils.Sandbox(<scope1>)制作了一个沙盒。我在ff组件中定义了一些函数(我称之为<scope2>),并通过以下方式将变量注入沙箱:sandbox.external = this;(“this”只是一个组件本身,在scope2中)
    完成这些步骤后,我按Components.utils.evalInSandbox( <code> , sandbox);在沙箱中运行一些代码,而<code>包含function sandboxFoo()调用external.foo()

    1)。 sandboxFoo运行时的全局范围是什么?我认为应该是

    2)。 external.foo调用时sandboxFoo的全局范围是什么?是<scope1>还是<scope2>?有文件吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  1. 在定义函数时建立范围。
  2. 对不起,不知道。
  3. 范围取决于您所覆盖的内容。如果两个组件覆盖相同的元素,则它们具有相同的范围。
  4. 全局范围将是定义它的范围。