çããããã«ã¡ã¯ãä»åã¯JavaScriptã®ð»globalThisð»ã«ã€ããŠè§£èª¬ããããšæããŸããglobalThisã¯JavaScript (ECMAScript) ã®æ°æ©èœã§ããçŸåšTC39ããã»ã¹ã®Stage 3ã«ãã1ããã®ãŸãŸäœäºããªããã°è¿ããã¡ã«ECMAScript2ã«æ£åŒæ¡çšãããããšã«ãªããŸãã
ãã®èšäºã¯JavaScript2 Advent Calendar 2018ã®5æ¥ç®ã®èšäºã§ãã
ããŠãçããã¯ãã®globalThisã䜿ã£ãããšãããã§ãããããç§ã¯ãããŸããããšããããçŸåšã®ãšããglobalThisãå©çšå¯èœãªã®ã¯ãã€ã仿¥å®å®çããªãªãŒã¹ãããã°ããã®Google Chrome 71ã®ã¿ã§ãããã®èšäºã«ã¯globalThisã䜿ã£ãã³ãŒãäŸãåºãŠããŸãããå®éã«åããããå Žåã¯ã¡ãããšGoogle Chromeãææ°çã«ãªã£ãŠããã確èªããŠãã ãããã
ïŒChrome 71ããªãªãŒã¹ãããã®ã¯æ¥æ¬æéã§ä»æ¥ïŒ12æ5æ¥ïŒã®ã¯ãã§ãããããªãããã®èšäºãèªãã¿ã€ãã³ã°ã«ãã£ãŠã¯ãŸã åºãŠããªããããããŸããããã®å Žåã¯åºããŸã§åŸ
ã€ãããŒã¿çãã€ã³ã¹ããŒã«ããŠãã ãããïŒ
⻠远èšïŒ2019-02-06ïŒïŒçŸåšã®ãšãããGoogle ChromeãšFirefoxã®ææ°çã§globalThisããµããŒããããŠããŸãã
⻠远èšïŒ2019-04-26ïŒïŒçŸåšã®ãšãããGoogle Chromeã»Firefoxã»Safariã®ææ°çããããŠnode.js v12ã§globalThisããµããŒããããŠããŸãã
globalThisãšã¯äœã
äžèšã§ãããšãglobalThisã¯ã°ããŒãã«ãªããžã§ã¯ãã§ããã°ããŒãã«ãªããžã§ã¯ããšããã®ã¯ãã°ããŒãã«å€æ°ãããããã£ã«æã€ãããªãªããžã§ã¯ãã§ããã€ãŸããã°ããŒãã«å€æ°ãäœããšããããã°ããŒãã«ãªããžã§ã¯ãã®ããããã£ãšãªã£ãŠçŸããã®ã§ãã
// ã°ããŒãã«å€æ°fooãäœæïŒ
foo = 123;
// globalThis.fooã123ã«ãªã£ãŠãã
console.log(globalThis.foo); // 123
// éãå¯èœ
globalThis.bar = 456;
console.log(bar); // 456
äœè«ã§ãããäœãä»ããªãã§ãããªãäœã£ã倿°ãšvarã䜿ã£ãŠå®£èšãã倿°ã¯ã°ããŒãã«å€æ°ã«ãªããŸãããletãconstã§äœã£ã倿°ã¯ã°ããŒãã«å€æ°ã«ãªããŸããããã£ã±ãletãconstã¯åãã§ããã
foo = 123;
console.log(globalThis.foo); // 123
var bar = 456;
console.log(globalThis.bar); // 456
let hoge = 7;
console.log(globalThis.hoge); // undefined
const fuga = 8;
console.log(globalThis.fuga); // undefined
ãã©ãŠã¶ã«ãããã°ããŒãã«ãªããžã§ã¯ã
ãšããã§ããããŸã§èªãã äžéšã®æ¹ã¯ãããïŒããšæã£ãã®ã§ã¯ãªãã§ããããããšããã®ããçãããã䜿ãã®ãã©ãŠã¶ã«ã¯æ¢ã«windowãåãã£ãŠããŸããããJavaScriptã§ã°ããŒãã«ãªããžã§ã¯ããšããã°windowã®ã¯ãã§ããå®éãã°ããŒãã«å€æ°ãäœããšwindowã®ããããã£ã«ãªãããšã¯å€ãããç¥ãããŠããŸãã
foo = 123;
console.log(window.foo); // 123
çš®ãæãããŠããŸããšãglobalThisã¯windowãšåãã§ãã
console.log(globalThis === window); // true
ãšã¯ãããããããglobalThisãšããããªããããããªã©ãšã¯ä»ããæããŸãããããwindowã¯ãã©ãŠã¶ïŒDOMãå®è£
ãããŠããç°å¢ïŒã«ãããããŸããããä»ãJavaScriptãåäœããç°å¢ã¯ããã ãã§ã¯ãããŸããã
node.jsã«ãããã°ããŒãã«ãªããžã§ã¯ã
ãã©ãŠã¶ä»¥å€ã®JavaScriptç°å¢ãšããŠä»£è¡šçãªã®ãnode.jsã§ãããã®node.jsã«ã¯windowã¯ååšããŸããã
ãã®äžæ¹ã§ãnode.jsã«ã¯ããšããšglobalãããããããã°ããŒãã«ãªããžã§ã¯ãã®åœ¹å²ãæãããŠããŸããã
foo = 123;
console.log(global.foo); // 123
ãŸã nodeã«globalThisã¯å®è£
ãããŠããŸããããglobalThisãå®è£
ããPRãèŠãã«ããã¯ãããšãããåœç¶ãªãããglobal === globalThisãšãªãããã§ãã
thisããã°ããŒãã«ãªããžã§ã¯ããååŸããæ¹æ³
ããŠããããŸã§ã§èšäºã¿ã€ãã«ã®ãã¡globalThisãšglobalãåºãŠããŸããããthisã¯äœã®é¢ä¿ãããã®ã§ããããã
ãããJavaScriptã«é¢ããŠããç¥ãããäºå®ã§ããããããã¬ãã«ã®ïŒé¢æ°ã®äžã§ãªãïŒã³ãŒããã颿°ãæ®éã«ïŒãªããžã§ã¯ãã®ã¡ãœãããšããŠã§ã¯ãªãïŒåŒãã å Žåã¯thisãã°ããŒãã«ãªããžã§ã¯ãã«ãªãããšãç¥ãããŠããŸãã
foo = 123;
console.log(this.foo); // thisãã°ããŒãã«ãªããžã§ã¯ããªã®ã§this.fooã¯123
showFoo();
function showFoo() {
// 颿°ã®äžã§ãthisã¯ã°ããŒãã«ãªããžã§ã¯ã
console.log(this.foo);
}
ãã ããstrictã¢ãŒãã®å Žåã¯é¢æ°ã®äžã§ã¯thisã¯ã°ããŒãã«ãªããžã§ã¯ãã§ã¯ãªãundefinedã«ãªãã®ã§ãã®æ¹æ³ã¯äœ¿ããŸããã
foo = 123;
showFoo();
function showFoo() {
'use strict';
// thisãundefinedãªã®ã§ããã¯ãšã©ãŒ
console.log(this.foo);
}
ãã®äžæ¹ãã°ããŒãã«ã®ïŒé¢æ°ã®äžã§ã¯ãªãïŒthisã¯strictã¢ãŒãã§ãã°ããŒãã«ãªããžã§ã¯ããšããŠå©çšå¯èœã§ãã
<script>
'use strict';
var foo = 123;
// ãããã¬ãã«ã®thisã¯strictã¢ãŒãã§ãã°ããŒãã«ãªããžã§ã¯ã
// ãšããŠå©çšå¯èœãªã®ã§123ã衚瀺ããã
console.log(this.foo);
showFoo();
function showFoo() {
// 颿°ã®äžã§ã¯thisã¯undefinedãªã®ã§ãšã©ãŒ
console.log(this.foo);
}
</script>
ãã è£æããã£ãŠãFunctionã³ã³ã¹ãã©ã¯ã¿ã䜿ãããšã§strictã¢ãŒãã®ã³ã³ããã¹ãå
ã§ãstrictã¢ãŒãã§ãªã颿°ãäœãããšãã§ããŸãã
<script>
'use strict';
var globalObj = (new Function('return this;'))();
console.log(globalObj === globalThis); // true
</script>
ãããããã¯ãã£ãŠãããã®è£æãããŸãåããªãç°å¢ãå°æ°ååšããŸããå ·äœçã«ã¯Chrome Appsã§äœ¿ããªãããã§ã3ãããšåçã«é¢æ°ãäœãã®ãæ°æã¡æªãã§ããã
ãŸãšãããšãã°ããŒãã«ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããæ¢åã®æ¹æ³ã¯äžé·äžçã§ãå®ç§ãªãã®ã¯ãããŸããã§ããã
-
thisã¯strictã¢ãŒãã®é¢æ°å ã§ã¯äœ¿çšäžå¯ããŸããå®ã¯node.jsã§ã¯thisã¯ã°ããŒãã«ãªããžã§ã¯ãã§ã¯ãªãã -
(new Function('return this'))()ã¯Chrome Appsã§äœ¿çšäžå¯ã -
windowã¯ãã©ãŠã¶ç°å¢ã®ã¿ã -
globalã¯node.jsã®ã¿ã
ãããŠglobalThis
äžã®ãªã¹ãã®äž2ã€ã¯æšæºã§å®ããããæ¹æ³ã§ãã䜿ããç¶æ³ãéãããŸãããäžã®2ã€ã¯ECMAScriptæšæºã«å«ãŸããŠããªãããã¯ç°å¢ã«ãã£ãŠäœ¿ãããã®ãç°ãªãçµ±äžãããŠããªããšããã®ãçŸç¶ã§ããããã®äžæ¹ã§ãä»ã®æä»£ãå šãŠã®ç°å¢ã§å ±éã®JavaScriptã³ãŒããåããããå Žé¢ã¯ãããããŸããïŒãã®æŠå¿µã¯æä»£ã«ãã£ãŠåŒã°ãæ¹ããããããšåãããŠãããããªæ°ãããŸãããèªåã¯Isomorphic JavaScriptãšãåŒã¶ã®ããã£ããæ¥ãŸããïŒ
ããã§ãECMAScriptæšæºãšããŠçµ±äžãããæ¹æ³ãçšæããããšããããšã§ç»å Žããã®ãglobalThisãªã®ã§ãã
globalThisã®æŠå¿µèªäœã¯èŠããã«ã°ããŒãã«ãªããžã§ã¯ããªã®ã§ç°¡åã§ããããã ããããèªãã§ããããªãã¯ãð»globalThisð»ãšããååã¯ã©ããªã®ãšæã£ãã®ã§ã¯ãªãã§ãããããç§ã¯æããŸãããJavaScriptãå«ããªäººãã¡ã«ãããã¬ãã£ããã£ã³ããŒã³ã®å¯Ÿè±¡ã«ãªã£ãŠããã®ãããèŠãthisãå
šé¢ã«æŒãåºããŠããã®ã¯ãªããªãæ»ããããŒãã³ã°ã§ãããããããglobalThisãšããååãèŠãŠãäœãèšãããã®ãããåãããŸããã
ãŸãããšã¯ãããæ°æã¡ã¯åãããªãã§ããããŸãããthisã¯ãããã¬ãã«ã®ïŒé¢æ°å
ã§ãªãïŒç°å¢ã§ã¯ã°ããŒãã«ãªããžã§ã¯ãã§ããããããã®ãããªïŒã°ããŒãã«ãªïŒç°å¢ã§ã®thisãåç
§ã§ãããã®ããšããããšã§globalThisãšããåœåãªã®ã§ãããã
ãã ãããã§ã²ãšã€èšããããšã¯ãglobalThisã¯å®ã¯æ¬¡åçã ãšããããšã§ããããšããšã¯ãã°ããŒãã«ãªããžã§ã¯ãã衚ã倿°ã®ååã¯globalã«ããäºå®ã§ãããã€ãŸããæ¢ã«ååšããŠããnode.jsã®ä»æ§ã«åãããããšããã®ã§ãã
ãšããããå®éã«globalãå®è£
ããŠã¿ããšãåããªããªããŠã§ããµã€ããããã€ãçºçããŠããŸããŸãããäŸãã°ãã®ã¹ã¬ããã§ã¯ãglobalãååšããã°node.jsç°å¢ã§ãããšå€æããŠnode.jsåãã®åŠçãè¡ããããªã³ãŒããååšããããšãæãããšãªãããããåå ã§ãŠã§ããµã€ããåäœããªããªã£ãäºäŸãå ±åãããŠããŸãã
ã¡ãã£ãšæ¬é¡ãããããŸããããŸã£ãããµãããã³ãŒããæžã人ããããã®ã§ãããããã¯globalããã°ããŒãã«ãªããžã§ã¯ãããšããŠäœ¿ãã®ã§ã¯ãªããnode.jsãã©ããå€å®ããããã®ãã©ã°ããšããŠäœ¿çšããã³ãŒããæžããããã«èµ·ãã£ãåé¡ã§ããglobalã§ã¯ãªãprocessã䜿çšããã³ãŒããªã©ãç®ã«ããŸããå°æ¥ãå±ã¶ãŸããŸããã
è©±ãæ»ããšãJavaScriptã¯åŸæ¹äºææ§ãéèŠãªèšèªã§ããã§ããããå®éã«ãŠã§ããµã€ããå£ããŠããŸãäºäŸãããã€ãçºçããããšã§globalã®æ¡çšã¯é æ«ããå¥ã®ååãæ¢ããªããã°ãããªããªããŸãããæ°ããååã«é¢ãããã¡ããã¡ãããè°è«ãGitHubã§èŠãããšãã§ããŸãã
ããã®ãããã§globalã®æšæºåã¯çŽ2幎ãé
ããããã§ãããäœã ããã ã§globalThisãšããååã«æ±ºãŸããChrome 71ã§ã€ãã«æ¥ã®ç®ãèŠãããšã«ãªã£ãããã§ããglobalThisãšããååã«ã€ããŠã¯ããããŒã¶ã«ã«å°ã説æããããŸãã
After some data-gathering to determine web compatibility of a short list of choices, we settled on globalThis, as this name is both highly likely to be web compatible, and also maps to the concept of being the âglobal this valueâ (and not the âglobal objectâ, per above).
ãŸãèŠããã«å
ã»ã©è¿°ã¹ããããªãã°ããŒãã«ãªthisã®å€ã ããglobalThisãªãã ããšããããšãæžããŠãããŸããã
ãŸãšã
ãããŸã§è¿°ã¹ãããšã¯ã ãããglobalThisã®ããããŒã¶ã«ã«æžããŠãããŸããæ¢ã«ãããèªãã§ããæ¹ã«ãšã£ãŠã¯æ°é®®å³ããªãå 容ã ã£ããããããŸãããããŸããã®ãããªæ¹ã¯1è¡ç®ã§æ¢ã«å¯ãããšæãã®ã§å€§äžå€«ã§ãããã
èŠããã«ãã°ããŒãã«ãªããžã§ã¯ããæ±ãæ¢åã®æ¹æ³ã¯ã©ããäžé·äžçã§çµ±äžãããæ¹æ³ãç¡ãã£ãã®ã§ãå
šãŠã®ç°å¢ã§äœ¿ããglobalThisãäœããŸãããšããããšã§ããçŸåšã®ãšãããããå©çšå¯èœãªã®ã¯Google Chromeã®ã¿ã§ãããä»ã®ãã©ãŠã¶ãnode.jsãè¿ããã¡ã«è¿œéããã®ã§ã¯ãªãããšæããŸãã
ãšã¯ãããå®åäžã¯å€ãç°å¢ãèæ
®ããªããã°ãªããªãã®ã§globalThisã ã䜿ãã°ä»ã¯èŠããªãããšããããã«ã¯ãããªãã®ãã€ãããšããã§ãããããglobalThis察å¿ãå ãã£ãçµæã³ãŒããè€éåãããããããŸããã
çãããããã°ããŒãã«ãªããžã§ã¯ããæ±ãæ©äŒãããã°ãglobalThisã®ããšãæãåºããŠãããŠãã ããã
äœè«
ä»åã¯äœè«ããŸãšãã®åŸã«æã£ãŠããŠã¿ãŸããã以éã仿§æžãšããå Žåã¯ECMAScript® 2018 Language Specificationãæããã®ãšããŸããïŒglobalThisã¯ES2018ã«ã¯å
¥ã£ãŠããŸããããŸã倧äžå€«ã§ããïŒ
ã¢ãžã¥ãŒã«ã·ã¹ãã ãšã°ããŒãã«ãªããžã§ã¯ã
ãšããã§ãã°ããŒãã«å€æ°ã£ãŠé£ããæŠå¿µã§ãããããã©ãŠã¶äžã®JavaScriptã§ã¯ãäœã宣èšããã«ãããªã代å
¥ããã倿°ãã颿°ã®å€ã§varã§å®£èšããã倿°ãã°ããŒãã«å€æ°ãšãªããŸããåè
ã¯strictã¢ãŒãã§ã¯äœ¿ããŸãããã
äžã®ã³ãŒãã§ç¢ºãããŠã¿ããšãvarã§å®£èšãã倿°fooãã°ããŒãã«ãªããžã§ã¯ãã®ããããã£ãšããŠåºçŸããŠããããšãåãããŸããã
<script>
'use strict';
var foo = 123;
console.log(globalThis.foo); // 123
</script>
âŠâŠã
ããã§ãããããéãã§ããããšæã£ã人ã¯ããªãJavaScriptã«è©³ããã§ããããåœããåã®ããšãäœãä»ããããšæã£ã人ã¯ä¿®è¡äžè¶³ã§ãã
ããããã£ãã®èª¬æã«ã¯å®ã¯èª€ã£ãŠãããšããããããŸããã©ããéãã®ããåããã§ããããã
çãã¯ä»¥äžã®ã³ãŒãã§ãã
<script type="module">
'use strict';
var foo = 123;
console.log(globalThis.foo); // undefined
</script>
ãªããšãscriptèŠçŽ ã«type="module"屿§ãä»ãããçµæãå€ãããŸããããã©ãŠã¶äžã§ã®JavaScriptãç¥ã£ãŠããæ¹ã¯ãtype="module"ãšããã®ãimportæã䜿ããšãã«å¿
èŠãªãã®ã§ããããšã¯ãåããã ãšæããŸãããECMAScriptçã«ã¯ããã¯å
éšã®ã³ãŒããScriptã§ã¯ãªãModuleãšããŠè©äŸ¡ããããã«ãã广ããããŸããå®ã¯ECMAScriptã§ã¯ããã°ã©ã ã¯ScriptãšModuleã®2çš®é¡ã«åé¡ãããŠãããexportæãimportæã¯Moduleã®äžã§ãã䜿ããªãæ§æã§ããæ®éã®scriptèŠçŽ ã§èªã¿ããŸãããããªåŸæ¥ã®JavaScriptã¯Scriptã§ãã
ãããŠããããã¬ãã«ã®varã¯Scriptã§ã¯ã°ããŒãã«å€æ°ãäœãäžæ¹ãModuleã§ã¯ããã§ã¯ãªãã®ã§ãããªããModuleã®äžã§ã¯èªåçã«strictã¢ãŒãã«ãªããããç¡å®£èšã§å€æ°ã«ä»£å
¥ããŠã°ããŒãã«å€æ°ãäœãããšã¯ã§ããŸãããã°ããŒãã«å€æ°ãäœããããã°ãæç€ºçã«ã°ããŒãã«ãªããžã§ã¯ããä»ããå¿
èŠããããŸãã
ãã®æåã¯ããããèããŠã¿ãã°åœç¶ã§ãããã¢ãžã¥ãŒã«ã«åããããããã°ã©ã ã«ãããŠãåã¢ãžã¥ãŒã«ã¯ç¬ç«ããŠããïŒç¬ç«ãã倿°ã¹ã³ãŒããæã£ãŠããïŒã¹ãã§ããã¢ãžã¥ãŒã«å
éšã§varã§äœã£ã倿°ãã°ããŒãã«å€æ°ã«ãªã£ãŠæ°è»œã«ä»ã«åœ±é¿ãäžããŠããã£ãŠã¯å°ããŸãã
èšèã ãã ãšåããã«ãããããããŸããã®ã§ãäŸã§èª¬æããŸããindex.htmlãšmod.jsãããªãããã°ã©ã ãèããŸãããã
<script type="module">
import { setFoo } from './mod.js';
var foo = 0;
setFoo(123456);
console.log(foo);
</script>
var foo;
export function setFoo(value) {
foo = value;
}
ãã®äŸã§ãindex.htmlã®console.logã§è¡šç€ºãããå€ã¯ãªãã§ããããã
çãã¯0ã§ãã123456ã§ã¯ãããŸãããããã¯ãŸãã«ãmod.jså
ã§å®çŸ©ããã倿°fooãã°ããŒãã«å€æ°ã§ã¯ãªãïŒã¢ãžã¥ãŒã«ã®ã¹ã³ãŒãå
ã®å€æ°ã«ãªã£ãŠããïŒããšã®èšŒå·Šã§ããããšããåããã«ãªãããšæããŸãã
ãã®ããã«ãã¢ãžã¥ãŒã«ã«åããããJavaScriptã§ã¯ã¢ãžã¥ãŒã«éã§å€æ°ã®ã¹ã³ãŒããåããããšã§ã¢ãžã¥ãŒã«éã®ç¬ç«æ§ãé«ããŠããŸãã
ãšããã§ã次ã®å®éšãšããŠmod.jsãå€ããŠæ¬¡ã®ããã«ããŠã¿ãŸãããã
<script type="module">
import { setFoo } from './mod.js';
var foo = 0;
setFoo(123456);
console.log(foo);
</script>
export function setFoo(value) {
globalThis.foo = 123456;
}
ãã®å Žåã¯console.logã§äœã衚瀺ãããã§ããããã
çãã¯ãã£ã±ã0ã§ããã123456ã ãããšæã£ãæ¹ã¯ã¡ãã£ãšåããããäžåºŠèªã¿ãªãããšãããããããŸããã
仿§æžã§ç¢ºããã
ä»èª¬æãã諞ã
ã仿§æžã§ç¢ºãããŠã¿ãããšããæ¹åãã®èª¬æãçšæããŸããããŸãScriptã«ãããã°ããŒãã«å€æ°ã®åæåã¯15.1.11 Runtime Semantics: GlobalDeclarationInstantiationã§è¡ãªãããŸããã¹ããã7ã§VarScopedDeclarationsããã¹ããã15ã§LexicallyScopedDeclarationsãèšç®ããŠããŸãããåè
ãvarã§å®£èšããã倿°ãã¡ãåŸè
ãletãconstã§å®£èšããã倿°ãã¡ã«çžåœããŸããåŸè
ã®åŠçã¯ã¹ããã16ã§è¡ãªãããŠãããæµãèªã¿ãããšenvRec.CreateMutableBindingãåŒã°ããŠããŸããããã¯èŠããã«ãçŸåšã®ã¹ã³ãŒãã«å€æ°ãäœæãããšããããšã§ãããã®ãçŸåšã®ã¹ã³ãŒããã¯å®ã¯ã°ããŒãã«ã¹ã³ãŒãïŒã°ããŒãã«ãªããžã§ã¯ãã®ããããã£ãšããŠçŸããã°ããŒãã«å€æ°ãã¡ã®ã¹ã³ãŒãïŒã§ã¯ãªããšããããšããã€ã³ãã§ãã
äžæ¹ãvarã§å®£èšããã倿°ãã¡ã®åŠçã¯ã¹ããã18ã§è¡ãªãããŠããŸãããã¡ãã¯envRec.CreateGlobalVarBindingã§åŠçãããŠããå
ã»ã©ãšã¯éããŸãããããã䜿ã£ãå Žåã¯ã°ããŒãã«å€æ°ïŒã°ããŒãã«ãªããžã§ã¯ãã®ããããã£ïŒãšããŠç»é²ãããŸãããããŸã§ããŸãšããŠäŸã§ç¢ºãããŠã¿ãŸãããã
<script>
// å®è¡éå§æç¹ã§äžèšã®GlobalDeclarationInstatiationã¯
// è¡ãªãããŠããã®ã§ãã°ããŒãã«ãªããžã§ã¯ãã«äžã§å®£èšãããŠãã倿°fooãååš
console.log('foo' in globalThis); // true
// var宣èšãå®éã«å®è¡ããããŸã§å€ã¯undefined
console.log(globalThis.foo); // undefined
var foo = 123;
// fooã«ä»£å
¥ãããã®ã§globalThis.fooãåœç¶æžãæãã
console.log(globalThis.foo); // 123
// globalThis.fooãžã®ä»£å
¥ã¯åæ ããã
globalThis.foo = 99999;
console.log(foo); // 99999
let bar = 345;
// letã§å®£èšãã倿°ã¯ã°ããŒãã«å€æ°ã§ã¯ãªã
console.log('bar' in globalThis); // false
// ã°ããŒãã«å€æ°ã®barãæžãæããŠããã®å€æ°barã«ã¯åœ±é¿ããªã
globalThis.bar = 99999;
console.log(bar); // 345
// éãåæ§
bar = -5;
console.log(globalThis.bar); // 99999
</script>
äžæ¹ã§Moduleã®å®è¡æã¯äœãèµ·ãã£ãŠããã§ãããããããã確ãããã«ã¯15.2.1.16.4 Instantiate() Concrete Methodããåç §ãããŠãã15.2.1.16.4.2 ModuleDeclarationEnvironmentSetupãèŠãŸãããã£ãã®GlobalDeclarationInstantiationãšã¡ãã£ãšäŒŒããããªããšãæžããŠãããŸããã
ãã ããvarã§å®£èšããã倿°ãã¡ãåŠçããéšåã§ããã¹ããã12ãèŠããšãCreateGlobalVarBindingã§ã¯ãªãCreateMutableBindingã䜿ãããŠããŸããããããå
ã»ã©ã®Scriptã®å Žåãšã®éãã§ãããModuleã®å Žåã«varã§å®£èšãã倿°ãã°ããŒãã«å€æ°ãšã¯ãªããªãïŒã¢ãžã¥ãŒã«ã®ãããã¬ãã«ã¹ã³ãŒãã®å€æ°ãšãªãïŒããšã®èšŒå·Šã§ãã
<script type="module">
// å
ã»ã©ãšã¯ç°ãªããvarã§å®£èšãã倿°ãã°ããŒãã«ãªããžã§ã¯ãã«ååšããªã
var foo = 123;
console.log('foo' in globalThis); // false
// globalThis.fooã«äœãã代å
¥ããŠããã®å€æ°fooã«ã¯åœ±é¿ããªã
globalThis.foo = 99999;
console.log(foo); // 123
</script>
ãã®ããã«ãModuleã§ã¯varã§å®£èšãã倿°ãã°ããŒãã«å€æ°ãšãªããŸããããã®ããšã¯æ³šæããŠããªããšçœ ã«ã¯ãŸãããšããããããããŸããã
node.jsã®ã¢ãžã¥ãŒã«ã·ã¹ãã
ã§ã¯ã仿§æžããã¯é¢ããŠæ¬¡ã®è©±é¡ã«ç§»ããŸããããJavaScriptãã°ãã°ãæžãæ¹ã®äžã§ããåç¯ã§åãäžããES ModulesïŒimportãšãexportãšãã䜿ãã¢ãžã¥ãŒã«ã·ã¹ãã ïŒã«ã¯ããŸã銎æã¿ããªããšããæ¹ããããããããŸãããnode.jsçšã®JavaScriptããã°ã©ã ã«ãããŠã¯ãŸã ãŸã CommonJS ModulesãçŸåœ¹ã§ããrequireã䜿ã£ãŠã¢ãžã¥ãŒã«ãèªã¿èŸŒããã€ã§ãããnode.jsãES Modulesã®å¯Ÿå¿ãé²ããŠããŸãããv10ã§ãã£ãšè©Šéšå®è£
ãå©çšå¯èœã«ãªã£ã段éã§ãã
ãããŠãnode.jsã«ãããåã¢ãžã¥ãŒã«ã¯ãScriptãModuleãã®åé¡ã§ããã°ScriptãšãªããŸãããããããããã¬ãã«varã§å€æ°ãäœããšã©ããªãã§ããããããã£ãã詊ããŠã¿ãŸããïŒåäœã確èªã§ããããã«globalThisã®ä»£ããã«globalã䜿çšããŠããŸããïŒ
console.log('foo' in global); // false
var foo = 123;
console.log(global.foo); // undefined
âŠâŠïŒ
ãªãããå
ã»ã©ã®èª¬æãšéããŸãããvarã§å®£èšãã倿°ãã°ããŒãã«å€æ°ã«ãªã£ãŠããŸããã
ããã¯å®ã¯node.jsã®æåã®ç¹åŸŽã§ãã现ããããšã¯çç¥ããŸãããåãã¡ã€ã«ïŒã¢ãžã¥ãŒã«ïŒã¯æé»ã®ãã¡ã«é¢æ°ã«å²ãŸããŠãããããvarã§å®£èšãã倿°ã¯ã°ããŒãã«ã¹ã³ãŒãã§ã¯ãªããã®é¢æ°ã¹ã³ãŒãã«å±ããããšã«ãªããŸããããã«ãããåãã¡ã€ã«ã§varã§å®£èšãã倿°ãã³ã³ããªã¯ãããããšãç¡ããªããšããå©ç¹ãããã»ãã__dirnameçã®å®è£
ã«ãå¯äžããŠãããããã§ãã
ãšããã§ãä»åã®è©±é¡ã«é¢é£ããnode.jsã®ç¹åŸŽçãªæåã¯ãã1ã€ãããŸããããããããã¬ãã«ã§ã®thisã§ãã
å®ã¯ãnode.jsç°å¢ã«ãããŠã¯ãããã¬ãã«ã®ïŒå
ã»ã©èª¬æããããã«node.jsã§ã®åã¢ãžã¥ãŒã«ã¯é¢æ°ã«å²ãŸããã®ã§å³å¯ã«ã¯ãããã¬ãã«ã§ã¯ãããŸãããïŒthisã¯ã°ããŒãã«ãªããžã§ã¯ãã§ã¯ãããŸããããã®ä»£ããã«exportsãªããžã§ã¯ããthisã«å
¥ã£ãŠããŸãã
// ããã¯node.jsã§ã¯true
console.log(this === exports);
exportsãšããã®ã¯CommonJS Modulesç±æ¥ã®ãã®ã§ãããŸã ã¡ãããšèª¿ã¹ãŠããŸããããES Modulesã¢ãŒãã§ã¯ãŸãéã£ãçµæã«ãªãããšã§ããããModuleã³ã³ããã¹ãã®ãããã¬ãã«ã§ã¯thisã¯undefinedã§ããããå€åundefinedã ãšæããŸããglobalThisãèããŠåããŸããã
globalThisã¯ã°ããŒãã«ãªããžã§ã¯ãã§ã¯ãªãïŒïŒ
ã¡ãã£ãšè©±ã¯å€ãããŸããããŸãšãã®çŽåãããã«ããããŒã¶ã«ããåŒçšããæãåæ²ããŸãã
After some data-gathering to determine web compatibility of a short list of choices, we settled on globalThis, as this name is both highly likely to be web compatible, and also maps to the concept of being the âglobal this valueâ (and not the âglobal objectâ, per above).
æåŸã®éšåïŒçè
ã倪åã§åŒ·èª¿ïŒã«è峿·±ãããšãæžããŠãããŸããèªãã§ã¿ããšãglobalThisã¯ã°ããŒãã«ãªããžã§ã¯ããããªãããšããè¡æçãªããšãè¿°ã¹ãŠããŸããããªããšããã®èšäºã§ããããglobalThisã¯ã°ããŒãã«ãªããžã§ã¯ãã ããšèšã£ãŠããã®ã¯åã ã£ãã®ã§ãã
ãšã¯ããå¥ã«å®åäžãªã«ãåé¡ãããããã§ã¯ãããŸãããã°ããŒãã«ãªããžã§ã¯ãã ãšæã£ãŠå®å¿ããŠäœ¿ã£ãŠãã ãããæåŸã«ããããèšãããã®ã¯äœããšããããšã解説ããããšæããŸãã
aboveã®ãšããã®ãªã³ã¯ã®å
ã§ã¯ãªã«ããWindowProxyãšããã¯ãŒããåºãŠããŠããŸãããããã¯ãã©ãŠã¶äžã®JavaScriptã«ãããwindowãªããžã§ã¯ãã®ããšãæããŠããŸãã
ããã§ãã€ã³ããšãªãã®ã¯ãJavaScriptã§ã¯ä»ã®ããŒãžïŒããæ£ç¢ºã«ã¯ãã©ãŠãžã³ã°ã³ã³ããã¹ãïŒã®windowãªããžã§ã¯ããååŸã§ãããšããç¹ã§ããããã«ã¯ãwindow.openã䜿çšãããšããiframeèŠçŽ ã®contentWindowã䜿çšãããªã©ã®æ¹æ³ããããŸãããŸããåœç¶ãªããåäžãªãªãžã³ããªã·ãŒã®åœ±é¿ãåããŸãã
ããã¯ãã©ãŠãžã³ã°ã³ã³ããã¹ãã«å¯ŸããŠçŽä»ããŠãããªããžã§ã¯ãã§ããããåç §ãããŠãããã©ãŠãžã³ã°ã³ã³ããã¹ãå ã§ããŒãžãç§»åããŠãWindowãªããžã§ã¯ãã¯å¥åšã§ãããã®ããšã確ããããããã¹ãããŒãžãçšæããã®ã§ãPCã®æ¹ã¯éããªããç¶ããèªãã§ãã ããããŸãããœãŒã¹ã³ãŒãã¯é©å®åç §ããŠãã ãããïŒã¹ããŒããã©ã³çã ãšè€æ°ã¿ããè¡ãæ¥ããã®ãé¢åãããããŸããããŸãããœãŒã¹ã³ãŒããèŠãªããšäœãèšã£ãŠãããããŸãã¡åãããªããããããŸãããïŒ
ãã¹ãããŒãžãéããšindex.htmlã衚瀺ãããŸãããfoo.htmlãéãããã¿ã³ãæŒããšfoo.htmlãæ°ããã¿ãã§éãããŸãããœãŒã¹ã³ãŒããèŠããšãwindow.openã®çµæïŒfoo.htmlã®Windowãªããžã§ã¯ãïŒãïŒindex.htmlå
ã®ïŒfooWindow倿°ã«ä»£å
¥ãããããšãåãããŸãã
ãã®fooWindow倿°ã¯ãä»éãããfoo.htmlå
ã«ãããwindowãªããžã§ã¯ããšåãã§ãããã®ããšã¯ãfooWindowãéããŠfoo.htmlå
ã®ã°ããŒãã«å€æ°ãåç
§ãããæäœã§ããããšããåãããŸãã
foo.htmlãèŠããšã°ããŒãã«å€æ°fooã«123ã代å
¥ãããŠããããšãåãããŸããäžæ¹ã§index.htmlã«ãããfooã®å€ã衚瀺ããã¿ã³ãæŒããšfooWindow.fooã衚瀺ãããŸããããã®çµæã¯123ãšãªããŸãã確ãã«foo.htmlå
ã®ã°ããŒãã«å€æ°fooãåç
§ã§ããŠããŸããã
ããã«ãfoo.htmlå
ã«ãããfooã®å€ã倿Žããã¿ã³ãæŒããšã°ããŒãã«å€æ°fooã®å€ã123456ã«ãªããŸãããã®åŸãindex.htmlã«æ»ã£ãŠå床ãfooã®å€ã衚瀺ããã¿ã³ãæŒããšä»åºŠã¯123456ã衚瀺ãããŸãããã®ããšããããfooWindow.fooãfoo.htmlã®äžã®ã°ããŒãã«å€æ°fooãã®ãã®ã§ããããšãåãããŸãã
åé¡ã¯ããããã§ãããã©ãŠã¶ã®ã¿ããšããã®ã¯ãŠã§ãããŒãžã衚瀺ããŠããããŠã§ãããŒãžã¯ãªã³ã¯ããã©ã£ãŠå¥ã®ããŒãžã«ç§»åããããšãã§ããŸããä»åã¯ãfoo.htmlã«ã¯bar.htmlãžã®ãªã³ã¯ãçšæããŠãããŸããã§ã¯ãbar.htmlã«ç§»åããŠã¿ãŠãã ããã
çããã¯åœç¶ãåç¥ããšæããŸãããå¥ã
ã®ããŒãžã§JavaScriptã®å®è¡ç¶æ
ãå
±æãããããšã¯ãããŸãããå¥ã®ããŒãžã«ç§»åããæç¹ã§å
šãŠã®ç¶æ
ã¯ãªã»ãããããŸããåœç¶ãwindowãéããã®ã«ãªããã°ããŒãã«å€æ°ãå
šéšãªã»ãããããŸãããã®ããšã確ãããããã«index.htmlã«æ»ã£ãŠãfooã®å€ã衚瀺ããã¿ã³ãæŒããŠã¿ãŸãããããããããšãçµæã¯undefinedãšãªããŸããããã¯ãfooWindow.fooãç¡ãããšã瀺ããŠãããbar.htmlå
ã«ã°ããŒãã«å€æ°fooãç¡ãããšãšå¯Ÿå¿ããŠããŸãã
ããã§ççŸãçºçããŠããããšã«ãæ°ã¥ãã§ãããããindex.htmlå
ã®å€æ°fooWindowã¯åžžã«åãããã¥ã¡ã³ãã§ããããã¯ãindex.htmlã«fooWindowã«å代å
¥ããã³ãŒããç¡ãããšããæããã§ãã
ããã«ãé¢ããããfoo.htmlããbar.htmlã«ç§»åããæç¹ã§fooWindow.fooã®å€ãå€ãããŸãããã€ãŸããfooWindowã¯foo.htmlã®ã°ããŒãã«ãªããžã§ã¯ãã ã£ãã®ã«ãbar.htmlã®ã°ããŒãã«ãªããžã§ã¯ãã«å€åãããšããããšã§ããããã¯ãfoo.htmlãšbar.htmlã¯å¥ã
ã®ããŒãžãªã®ã§å¥ã
ã®ã°ããŒãã«ãªããžã§ã¯ããæã€ãšããäºå®ãšççŸããŠããŸã4ã
èŠçŽãããšãindex.htmlããèŠããšfooWindowã«å
¥ã£ãŠãããªããžã§ã¯ãã¯å€ãã£ãŠããªãã®ã«ãå®éã¯ããŒãžé·ç§»ã®éçšã§å¥ã®ã°ããŒãã«ãªããžã§ã¯ãã«å€ãã£ãŠãããšããççŸã§ãã
ãã®ççŸãè§£æ¶ããããã«å°å
¥ãããã®ãWindowProxyã§ããWindowProxyã¯å
éšã«Windowãªããžã§ã¯ããžã®åç
§ãæã£ãŠããŠãåºæ¬çã«WindowProxyãžã®æäœã¯å
éšã®Windowãžã®æäœãšãªããŸã5ãä»åã®äŸã§ã¯fooWindowã¯WindowProxyã§ãããæåã¯å
éšã§foo.htmlã®Windowãªããžã§ã¯ããšã€ãªãã£ãŠããŸããã§ããããfooWindowããã®èªã¿èŸŒã¿ã¯foo.htmlã®Windowãªããžã§ã¯ãããã®èªã¿èŸŒã¿ãšãªããªããŸãã
foo.htmlãbar.htmlã«ããŒãžé·ç§»ãããšãfooWindowãå
éšã«æã£ãŠããWindowãªããžã§ã¯ããžã®åç
§ãbar.htmlã®Windowãªããžã§ã¯ããžãšå·®ãæ¿ãããŸããããã¯ãããŸã§å
éšçãªåäœã§ãããfooWindowã®WindowProxyãªããžã§ã¯ããšããŠã®åäžæ§ã¯ä¿ã£ããŸãŸã§ãããããããã®æç¹ã§fooWindowãžã®æäœã¯å
éšã®Windowãªããžã§ã¯ããããªãã¡bar.htmlã®Windowãªããžã§ã¯ããžã®æäœãšãªããããå®éã«æäœãããWindowãªããžã§ã¯ããæåãšç°ãªã£ãŠããŸãã
ãã®2å±€æ§é ã«ãããåè¿°ã®ççŸãè§£æ¶ãããããšã«ãªããŸããçµå±ã®ãšããäœãèšãããã£ãã®ããšãããšããwindowãšããã®ã¯å®ã¯WindowProxyã®ããšã§ãã£ãŠã°ããŒãã«ãªããžã§ã¯ãããWindowã§ã¯ãªããããä»åäœãglobalThisãã°ããŒãã«ãªããžã§ã¯ããšåŒã¶ã®ã¯æãããããªã®ã§globalThisã«ãªã£ãããšãã話ã§ããã
é·ã
ãšèª¬æããŸãããããªãã ããšãŠããããããã§ãããããã§ã¡ãã£ãšè©±ãæ»ããŠãglobalThisã®ããããŒã¶ã«ããäžæåŒçšããŸãã
ES6/ES2015 does not account for the Window/WindowProxy structure, and simply refers to âthe global objectâ directly. This specification does the same.
ïŒè¶ æèš³ïŒ ãªããHTMLã®äººãã¡ã¯
WindowãšãWindowProxyãšãèšã£ãŠããã©å¥ã«ECMAScriptçã«ã¯ããããã®ã©ãŒã§ããããã§ãé¢åãããããåã«ãã°ããŒãã«ãªããžã§ã¯ããã£ãŠããšã«ããŠãŸãã
ãšããããã§ãäžå¿ååæ±ºãããšãã«æ°ãã€ãããšã¯ãããå šããã£ãŠã©ãã§ããã話ã§ããããŸãã«äœè«ã§ããã
-
詳现ã¯ä»ã®ãã£ãšè©³ããèšäºã«è²ããŸãããECMAScriptã«æ°æ©èœã远å ãããã«ã¯Stage1 ã Stage 4ãšãã4ã€ã®æ®µéãçµãå¿ èŠããããŸããStage 3ã¯ãæ©èœã®ä»æ§ãåºãŸãããã©ãŠã¶çã«è©Šéšçã«å®è£ ãããã®ãåŸ ã£ãŠããç¶æ ã§ãã â©
-
ä»ãããªèª¬æã§ãããECMAScriptãšããã®ã¯ãã£ããèšããšJavaScriptãçå®ããŠããæšæºä»æ§ã®ååã§ãããã®èšäºã§ã¯ããã©ãŠã¶ãšãnode.jsãšãã§åãå®éã®JavaScriptãšå¯Ÿæ¯ããŠã仿§ãšããŠå®ããããJavaScriptã®æåã«è§Šããããšãã«ECMAScriptãšããèšèã䜿ã£ãŠããŸãã â©
-
ããã ãChrome Appsã¯ä»ã¯Chrome OSã®ã¿ã察象ãããã§ããã â©
-
ãã®äºå®ã«ã€ããŠã¯çç±ã説æããŠããŸããã§ããããHTMLã®ä»æ§ã§ãã®ããã«å®çŸ©ãããŠããŸããå¥ã®HTMLææžãžã®ããã²ãŒã·ã§ã³ãçºçãããšãHTMLææžãããŒãããéçšã§æ°ããDocumentãäœæããããã®éçšã§ã°ããŒãã«ãªããžã§ã¯ããšããŠæ°ããWindowãªããžã§ã¯ããäœãããããšãæèšãããŠããŸãã â©
-
ãã ãããªãªãžã³ããŸããå Žåã¯å¶éãããããŸããããã¯
WindowProxyã®å®çŸ©ã§èŠå®ãããŠããŸãã â©