-
Notifications
You must be signed in to change notification settings - Fork 8
WebModuleIdiom
uupaa edited this page Apr 28, 2015
·
36 revisions
WebModule idiom は、どこでも動くJavaScriptコードを記述するためのイディオム(トリックの一種)です。
WebModule idiom を使うと、各プラットフォームにおけるルートオブジェクト(global object)を獲得する事ができます。
2014〜2015年は version 2 のスタイルが使われています。
// WebModule idiom version 2
(function(global) {
"use strict";
// global["MyModule"].say("hello");
})((this || 0).self || global);WebModule idiom version 2 は各プラットフォームにおいて以下のように評価されます。
| platform | expression and result |
|---|---|
| old Node.js |
((undefined ││ 0).self ││ global)→ ((0).self ││ global)→ ((undefined ││ global)→ (global)→ Global Object |
| new 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 |
以下は、2013年に使用されていた古い書き方(version 1)です。
// WebModule idiom version 1
(function(global) {
"use strict";
// global["MyModule"].say("hello");
})(this.self || global);ES6 Module スコープ内はデフォルトで strict モードになります。
また strict モードにおいて this は undefined になるため、Version 2 の書き方が利用できないケースもあります。
// ここは strict mode です
export default class MyModule {
constructor() {
}
say(msg) {
console.log(msg); // ここも strict mode です
}
};var global = global || self; を使うと、適当な場所で global オブジェクトを獲得する事ができます。
var global = global || self;
(function(global) {
})(global);