Skip to content
uupaa edited this page May 26, 2015 · 36 revisions

WebModule Idiom

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

in ES6 Modules

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);

Clone this wiki locally