-
Notifications
You must be signed in to change notification settings - Fork 8
WebModuleIdiom
uupaa edited this page May 19, 2017
·
36 revisions
このエントリでは、WebModule に使われている Idiom(トリック) について解説しています。
WebModule はどこでも動きます。
この「どこでも動く」JavaScriptを実現するためのイディオムが WebModuleIdiom です。 この idiom を使うと、各プラットフォームにおけるルートオブジェクト(GLOBAL object)を獲得する事ができます。
// WebModuleIdiom
// var GLOBAL = (this || 0).self || global; // version 0.7.3
var GLOBAL = (this || 0).self || (typeof self !== "undefined") ? self : global; // support ESModulesGLOBAL が既に宣言されている環境では global の値で GLOBAL を上書きします、electron や Node.js がこのケースです。
GLOBAL が undefined の場合は WebModuleIdiom を各プラットフォームの都合に合わせて評価し、Global Object を獲得します。
| platform | this | self | global | expression and result |
|---|---|---|---|---|
| Browser | ⭕ | ⭕ |
(window ││ 0).self ││ (true) ? self : undefined→ (window).self→ window.self→ Window Object |
|
| ESModules | ⭕ |
(undefined ││ 0).self ││ (true) ? self : undefined→ (0).self ││ self→ undefined ││ self→ Window Object |
||
| Worker | ⭕ | ⭕ |
(WorkerGlobalScope ││ 0).self ││ (true) ? self : undefined→ (WorkerGlobalScope).self→ WorkerGlobalScope.self→ WorkerGlobalScope Object |
|
| Node.js | ⭕ | ⭕ |
(global ││ 0).self ││ (false) ? undefined : global→ (GLOBAL).self ││ global→ undefined ││ global→ global→ Global Object |
|
| Electron main context |
⭕ | ⭕ | ⭕ |
(global ││ 0).self ││ (true) ? self : global→ (GLOBAL).self ││ self→ undefined ││ self→ global→ Global Object |
| Electron render context |
⭕ | ⭕ |
(window ││ 0).self ││ (true) ? self : undefined→ (window).self→ window.self→ Window Object |
|
| NW.js node context |
⭕ | ⭕ | ⭕ |
(global ││ 0).self ││ (true) ? self : global→ (GLOBAL).self ││ self→ undefined ││ self→ global→ Global Object |
| NW.js browser context |
⭕ | ⭕ |
(window ││ 0).self ││ (true) ? self : undefined→ (window).self→ window.self→ Window Object |