mozilla

Revision 510399 of Components.utils.import

  • Revision slug: Components.utils.import
  • Revision title: Components.utils.import
  • Revision id: 510399
  • Created:
  • Creator: LinusYu
  • Is current revision? No
  • Comment

Revision Content

{{ Gecko_minversion_header("1.9") }}

这个方法在 Firefox 3 中被引入,它使得在不同的作用域之间分享代码变得更加容易。例如:你可以直接导入 XPCOMUtils.jsm 而不必复制/粘贴冗长的XPCOM组件。

查看 Using JavaScript code modules 了解更多细节。

Note: Prior to {{Gecko("2.0")}}, JavaScript code modules could only be loaded using file: or resource: URLs. {{Gecko("2.0")}} adds support for loading modules from chrome: URLs, even those inside JAR archives.

Syntax(语法)

Components.utils.import(url [, scope]);

// Or, if you use a tool such as jslint which reports compiler errors for the above,

Components.utils["import"](url [, scope]);

Parameters(参数)

url
一个将被导入的script的URL,这个URL必须是在磁盘上的一个文件,可能在JAR之中。
scope
一个可选的导入对象,如果省略则使用全局对象。当读取文件发生错误(如语法错误等)时会抛出异常。

Example(例子)

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

Difference from mozIJSSubScriptLoader(与mozIJSSubScriptLoader的区别)

The differences from {{ Interface("mozIJSSubScriptLoader") }}:

  • The behavior when importing/loading the same code from different locations:
    • the subscript loader evaluates the specified code each time it is invoked, with the caller's global object.
    • Components.utils.import evaluates the code of each module only once, in its own scope.

    例如:

    var scope1 = {}, scope2 = {};
    Components.utils.import("resource://gre/modules/JSON.jsm", scope1);
    Components.utils.import("resource://gre/modules/JSON.jsm", scope2);
    assert(scope2.XPCOMUtils === scope1.XPCOMUtils);
    

    ...returns true, whereas:

    var someURL = "resource://gre/modules/JSON.jsm"; 
    var obj1 = {}, obj2 = {}; 
    var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
                           .getService(Components.interfaces.mozIJSSubScriptLoader); 
    loader.loadSubScript(someURL, obj1); 
    loader.loadSubScript(someURL, obj2);
    assert(obj2 === obj1);
    

    ...returns false.

    这意味着 Components.utils.import 更适合用于在不同的作用域JS脚本之间分享代码(数据)

Additional Resources(其他资源)

  • {{ Bug(238324) }}
  • The documentation in {{ Source("js/xpconnect/idl/xpccomponents.idl", "xpccomponents.idl") }}
  • The tests in {{ Source("js/xpconnect/tests/unit/") }}

 

 

{{ languages( { "es": "es/Components.utils.import", "fr": "fr/Components.utils.import", "ja": "ja/Components.utils.import" } ) }}

Revision Source

<p>{{ Gecko_minversion_header("1.9") }}</p>
<p>这个方法在 <a href="/en/Firefox_3_for_developers" title="en/Firefox_3_for_developers">Firefox 3</a> 中被引入,它使得在不同的作用域之间分享代码变得更加容易。例如:你可以直接导入 <a href="/en/JavaScript_code_modules/XPCOMUtils.jsm" title="en/XPCOMUtils.jsm">XPCOMUtils.jsm</a> 而不必复制/粘贴冗长的XPCOM组件。</p>
<p>查看 <a href="/en/JavaScript_code_modules/Using" title="en/Using_JavaScript_code_modules">Using JavaScript code modules</a> 了解更多细节。</p>
<div class="note">
 <p><strong>Note:</strong> Prior to {{Gecko("2.0")}}, JavaScript code modules could only be loaded using <strong>file:</strong> or <strong>resource:</strong> URLs. {{Gecko("2.0")}} adds support for loading modules from <strong>chrome:</strong> URLs, even those inside JAR archives.</p>
</div>
<h3 id="Syntax" name="Syntax">Syntax(语法)</h3>
<pre class="eval">
Components.utils.import<em>(url</em> [, <em>scope</em>]);

// Or, if you use a tool such as jslint which reports compiler errors for the above,

Components.utils["import"](<em>url </em>[, <em>scope</em>]);</pre>
<h3 id="Parameters" name="Parameters">Parameters(参数)</h3>
<dl>
 <dt>
  <code>url</code></dt>
 <dd>
  <code>一个将被导入的script的URL,这个URL必须是在磁盘上的一个文件,可能在JAR之中。</code></dd>
 <dt>
  <code>scope</code></dt>
 <dd>
  <code>一个可选的导入对象,如果</code>省略则使用全局对象。当读取文件发生错误(如语法错误等)时会抛出异常。</dd>
</dl>
<h3 id="Example" name="Example">Example(例子)</h3>
<pre class="eval">
Components.utils.import("<a class="external" href="resource://gre/modules/XPCOMUtils.jsm" rel="freelink">resource://gre/modules/XPCOMUtils.jsm</a>");
</pre>
<h3 id="Difference_from_mozIJSSubScriptLoader" name="Difference_from_mozIJSSubScriptLoader">Difference from mozIJSSubScriptLoader(与mozIJSSubScriptLoader的区别)</h3>
<p>The differences from {{ Interface("mozIJSSubScriptLoader") }}:</p>
<ul>
 <li>The behavior when importing/loading the same code from different locations:
  <ul>
   <li>the subscript loader evaluates the specified code each time it is invoked, with the caller's global object.</li>
   <li><code>Components.utils.import</code> evaluates the code of each module only once, in its own scope.</li>
  </ul>
  <p>例如:</p>
  <pre class="eval">
var scope1 = {}, scope2 = {};
Components.utils.import("<a class="external" href="resource://gre/modules/JSON.jsm" rel="freelink">resource://gre/modules/JSON.jsm</a>", scope1);
Components.utils.import("<a class="external" href="resource://gre/modules/JSON.jsm" rel="freelink">resource://gre/modules/JSON.jsm</a>", scope2);
assert(scope2.XPCOMUtils === scope1.XPCOMUtils);
</pre>
  <p>...returns <code>true</code>, whereas:</p>
  <pre class="eval">
var someURL = "<a class="external" href="resource://gre/modules/JSON.jsm" rel="freelink">resource://gre/modules/JSON.jsm</a>"; 
var obj1 = {}, obj2 = {}; 
var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
                       .getService(Components.interfaces.mozIJSSubScriptLoader); 
loader.loadSubScript(someURL, obj1); 
loader.loadSubScript(someURL, obj2);
assert(obj2 === obj1);
</pre>
  <p>...returns <code>false</code>.</p>
  <p>这意味着<code> Components.utils.import 更适合用于在不同的作用域JS脚本之间分享代码(数据)</code>。</p>
 </li>
</ul>
<h3 id="Additional_Resources" name="Additional_Resources">Additional Resources(其他资源)</h3>
<ul>
 <li>{{ Bug(238324) }}</li>
 <li>The documentation in {{ Source("js/xpconnect/idl/xpccomponents.idl", "xpccomponents.idl") }}</li>
 <li>The tests in {{ Source("js/xpconnect/tests/unit/") }}</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>{{ languages( { "es": "es/Components.utils.import", "fr": "fr/Components.utils.import", "ja": "ja/Components.utils.import" } ) }}</p>
Revert to this revision