--- title: Components.utils.import slug: Components.utils.import translation_of: Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.import ---
这个方法在 Firefox 3 中被引入,它使得在不同的作用域之间分享代码变得更加容易。例如:你可以直接导入 XPCOMUtils.jsm 而不必复制/粘贴冗长的XPCOM组件。
查看 Using JavaScript code modules 了解更多细节。
Note: Gecko 2.0 之前, JavaScript code modules 仅可以使用 file: 或 resource: URLs. Gecko 2.0 引入了对 chrome: URLs, even those inside JAR archives 的支持。
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]);
url
一个将被导入的script的URL,这个URL必须是在磁盘上的一个文件,可能在JAR之中。
scope
一个可选的导入对象,如果
省略则使用全局对象。当读取文件发生错误(如语法错误等)时会抛出异常。Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
The differences from mozIJSSubScriptLoader
:
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脚本之间分享代码(数据)
。
js/xpconnect/tests/unit/