-
Notifications
You must be signed in to change notification settings - Fork 8
WebModuleIdiom
uupaa edited this page May 26, 2015
·
36 revisions
WebModule はどこでも動きます。WebModule idoom は、この「どこでも動く」JavaScriptを実現するためのイディオム(トリックの一種)です。
この idiom を使うと、各プラットフォームにおけるルートオブジェクト(GLOBAL object)を獲得する事ができます。
// --- global variables ------------------------------------
var GLOBAL = GLOBAL || (this || 0).self || global;
var GLOBAL = GLOBAL || ... より前に GLOBAL が宣言されている場合はその値を使用します。
GLOBAL が宣言されていない場合は (this || 0).self || global を各プラットフォームの都合に合わせて評価します。
| platform | expression and result |
|---|---|
| Node.js NW.js (Node context) |
((global ││ 0).self ││ global)→ ((GLOBAL).self ││ global)→ ((undefined ││ global)→ (global)→ Global Object |
| WebWorkers |
((WorkerGlobalScope ││ 0).self ││ undefined)→ ((WorkerGlobalScope).self)→ (WorkerGlobalScope.self)→ Global Object |
| Browser NW.js (Browser context) |
((window ││ 0).self ││ undefined)→ ((window).self)→ (window.self)→ Global Object |
ES6 Module スコープ内はデフォルトで strict モードになります。
また strict モードにおいて this は undefined になるため、WebModule idiom の ((this ││ 0).self ││ global) がエラーになる環境も存在します。
var MY_GLOBAL = (this || 0).self || global; // -> Error "global" is not defined.そのような場合は var GLOBAL = GLOBAL || self; を使い問題を解決します。
var GLOBAL = GLOBAL || self;
(function(global) {
})(GLOBAL);