- Components.utils
- バグ 238324
- The documentation in xpccomponents.idl
- The tests in
js/xpconnect/tests/unit/
- Importing SDK/CommonJS modules into other code
--- title: Components.utils.import slug: Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.import tags: - NeedsContent - 'XPCOM:Language Bindings' - XPConnect translation_of: Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.import ---
このメソッドは Firefox 3 で導入され、異なるスコープ間でコードを簡単に共有するのに使われます。例えば、自分のコンポーネントの中で、コンポーネント登録の長い定型文をコピー&ペーストすることを避けるために XPCOMUtils.jsm をインポートすることができます。
詳細は、JavaScript コードモジュールの利用 を参照してください。
注記: Gecko 2.0 以前、JavaScript コードモジュールは file: URL または resource: URL のみでしか読み込めませんでした。Gecko 2.0 で chrome: URL からの読み込みに対応しました。JAR アーカイブ内にあっても使用できます。
Components.utils.import(url [, scope]); // 上記のコードでは jslint などの構文チェックツールコンパイラエラーが報告される場合は以下のように書けます。 Components.utils["import"](url [, scope]);
url
scope
Under Boot2Gecko, the scope is not optional. If your code is meant to work on all platforms, you should always provide a scope.
In case of doubt, this
is generally a good scope.
読み込んだファイル内でエラー (構文エラーなど) が発生した場合、import が例外を投げます。
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
mozIJSSubScriptLoader
との違い:
Components.utils.import
はそれぞれのモジュールのコードを一度だけ、自分自身のスコープの中で評価します例:
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);
...true
を返します。対して:
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);
..false
を返します。
これは、異なるスコープで実行している JS 間での効果的なコード (とデータ?) の共有に Components.utils.import
がより適している事を意味しています。
js/xpconnect/tests/unit/