çããããã«ã¡ã¯ãä»åã¯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
ã®å®çŸ©ã§èŠå®ãããŠããŸãã â©