globalThis
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2020å¹´1æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
globalThis ã¯ã°ãã¼ãã«ããããã£ã§ãã°ãã¼ãã«ãªãã¸ã§ã¯ãã¨åçã§ããã°ãã¼ãã«ãª thisãæ ¼ç´ããã¦ãã¾ãã
試ãã¦ã¿ã¾ããã
function canMakeHTTPRequest() {
return typeof globalThis.XMLHttpRequest === "function";
}
console.log(canMakeHTTPRequest());
// Expected output (in a browser): true
å¤
ã°ãã¼ãã«ã® this ãªãã¸ã§ã¯ãã§ãã
globalThis ã®ããããã£å±æ§ | |
|---|---|
| æ¸è¾¼å¯è½ | å¯ |
| åæå¯è½ | ä¸å¯ |
| è¨å®å¯è½ | å¯ |
ã¡ã¢:
globalThis ããããã£ã¯æ§æå¯è½ã§æ¸ãè¾¼ã¿å¯è½ãªã®ã§ãã³ã¼ãã®ä½æè
ã¯ãä¿¡é ¼ã§ããªãã³ã¼ããå®è¡ããéã«ãã®ããããã£ãéå
¬éã«ãã¦ãã°ãã¼ãã«ãªãã¸ã§ã¯ããå
¬éãããã®ãé²ããã¨ãã§ãã¾ãã
解説
徿¥ãã°ãã¼ãã«ã¹ã³ã¼ãã«ã¢ã¯ã»ã¹ããã«ã¯ãJavaScript ç°å¢ãã¨ã«ç°ãªãæ§æãå¿
è¦ã¨ãã¦ãã¾ãããã¦ã§ãä¸ã§ã¯ window, self, frames ã使ããã¨ãã§ãã¾ããããã Web Worker 㯠self ã®ã¿ãå©ç¨ãããã¨ãã§ãã¾ããNode.js ã¯ãããã®ããããå©ç¨ã§ããã代ããã« global ã使ç¨ããå¿
è¦ãããã¾ãã
this ãã¼ã¯ã¼ãã¯ã峿 ¼ã§ãªãã¢ã¼ãã§å®è¡ããã¦ãã颿°ã®ä¸ã§ä½¿ç¨ãããã¨ãã§ãã¾ããã峿 ¼ã¢ã¼ãã§å®è¡ããã¦ããã¢ã¸ã¥ã¼ã«ã颿°ã®ä¸ã§ã¯ undefined ã«ãªãã¾ããFunction('return this')() ã使ç¨ãããã¨ãã§ãã¾ãããCSP ãªã©ã«ãã£ã¦ eval() ãç¡å¹ã«ãã¦ããç°å¢ã§ã¯ããã®æ¹æ³ã§ã Function ã®ä½¿ç¨ãæå¶ããã¾ãã
globalThis ããããã£ã¯ãç°å¢ãè¶ãã¦ã°ãã¼ãã«ãª this å¤ (ããªãã¡ã°ãã¼ãã«ãªãã¸ã§ã¯ãèªèº«) ã«ã¢ã¯ã»ã¹ããããã®æ¨æºçãªæ¹æ³ãæä¾ãã¾ããwindow ã self ãªã©ã®åæ§ã®ããããã£ã¨ã¯ç°ãªããããã¯ã¦ã£ã³ãã¦ã®ã³ã³ããã¹ãã§ãéã¦ã£ã³ãã¦ã®ã³ã³ããã¹ãã§ãåä½ãããã¨ãä¿è¨¼ããã¦ãã¾ãããã®æ¹æ³ã§ã¯ãã³ã¼ããã©ã®ç°å¢ã§å®è¡ããã¦ããã®ããç¥ããªãã¦ããä¸è²«ããæ¹æ³ã§ã°ãã¼ãã«ãªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ããååãè¦ããããããããã«ãã°ãã¼ãã«ã¹ã³ã¼ãã§ã¯ this ã®å¤ã¯ globalThis ã§ãããã¨ãå¿ããªãã§ãã ããã
ã¡ã¢:
globalThis ã¯ãé常ãã°ãã¼ãã«ãªãã¸ã§ã¯ãã¨åãæ¦å¿µã§ãï¼ã¤ã¾ããglobalThis ã«ããããã£ã追å ããã¨ããããã¯ã°ãã¼ãã«å¤æ°ã«ãªãã¾ãï¼ãããã¯ããã©ã¦ã¶ã¼ã Node ã®å ´åã§ããããã¹ãã¯ãã°ãã¼ãã«ãªãã¸ã§ã¯ãã¨ã¯ç¡é¢ä¿ã®å¥ã®å¤ã globalThis ã«æå®ãããã¨ãã§ãã¾ãã
HTML 㨠WindowProxy
å¤ãã®ã¨ã³ã¸ã³ã§ã¯ globalThis ã¯å®å¨ã®ã°ãã¼ãã«ãªãã¸ã§ã¯ãã®åç
§ã«ãªãã¾ãããã¦ã§ããã©ã¦ã¶ã¼ã«ããã¦ã¯ãiframe ããã³ã¦ã£ã³ãã¦éã®ã»ãã¥ãªãã£ä¸ã®é
æ
®ãããããã¯ï¼ç´æ¥ã¢ã¯ã»ã¹ã§ããªãï¼å®å¨ã®ã°ãã¼ãã«ãªãã¸ã§ã¯ãã«é¢ãã Proxy ã«ãªãã¾ããä¸è¬çãªå©ç¨ã«é¢ãããã¨ã¯ç¨ã§ãããèªèãã¦ãããã¨ã¯éè¦ã§ãã
å½å
self ã global ã®ãããªä»ã®ä¸è¬çãªååã®é¸æè¢ã¯ãæ¢åã®ã³ã¼ãã¨ã®äºææ§ãæãªãå¯è½æ§ããããããåè£ããé¤å¤ããã¾ããã詳ãã㯠language proposal's "naming" document ãåç
§ãã¦ãã ããã
globalThis ã¯ãæåéããã°ãã¼ãã«ãª this å¤ã§ããããã¯ããªãã¸ã§ã¯ããæå®ããã«å¼ã³åºããã峿 ¼ã¢ã¼ãã§ã¯ãªã颿°å
ã® this å¤ã¨åãå¤ã§ããã¾ããã¹ã¯ãªããã®ã°ãã¼ãã«ã¹ã³ã¼ãã«ããã this ã®å¤ã§ãããã¾ãã
ä¾
>ç°ãªãç°å¢éã§ã°ãã¼ãã«ã®æ¤ç´¢
é常ãã°ãã¼ãã«ãªãã¸ã§ã¯ããæç¤ºçã«æå®ããå¿ è¦ã¯ããã¾ããããã®ããããã£ã¯ãã°ãã¼ãã«å¤æ°ã¨ãã¦èªåçã«ã¢ã¯ã»ã¹ã§ãã¾ãã
console.log(window.Math === Math); // true
ãã ããã°ãã¼ãã«ãªãã¸ã§ã¯ãã«æç¤ºçã«ã¢ã¯ã»ã¹ããå¿ è¦ãããå ´åã 1 ã¤ããã¾ããããã¯ãé常 ããªãã£ã« ã®ç®çã§ãã°ãã¼ãã«ãªãã¸ã§ã¯ãã«æ¸ãè¾¼ã¿ãè¡ãå ´åã§ãã
globalThis ã®å°å
¥åãç°å¢å
¨ä½ã®ã°ãã¼ãã«ãªãã¸ã§ã¯ããåå¾ããå¯ä¸ã®ä¿¡é ¼ã§ããã¯ãã¹ãã©ãããã©ã¼ã ãªæ¹æ³ã¯ Function('return this')() ã§ãããããããããã¯ä¸é¨ã®è¨å®ã§ CSP éåãçºçãããããã使è
ã¯æ¬¡ã®ãããªåºåå®ç¾©ã使ç¨ãããã¨ã«ãªãã¾ãï¼ãªãªã¸ãã«ã® core-js ã®ã½ã¼ã¹ãè¥å¹²å¤æ´ï¼ã
function check(it) {
// Math ã¯ããããç°å¢ã«ã°ãã¼ãã«ã«åå¨ãããã¨ãç¥ããã¦ãã
return it && it.Math === Math && it;
}
const globalObject =
check(typeof window === "object" && window) ||
check(typeof self === "object" && self) ||
check(typeof global === "object" && global) ||
// 峿 ¼ã¢ã¼ãã§å®è¡ããã¨ããã㯠undefined ãè¿ã
(function () {
return this;
})() ||
Function("return this")();
ã°ãã¼ãã«ãªãã¸ã§ã¯ããåå¾ããå¾ããã®ãªãã¸ã§ã¯ãã«æ°ããã°ãã¼ãã«ãå®ç¾©ãããã¨ãã§ãã¾ããä¾ãã°ãIntl ã®å®è£
ã追å ããå ´åã§ãã
if (typeof globalObject.Intl === "undefined") {
// No Intl in this environment; define our own on the global scope
Object.defineProperty(globalObject, "Intl", {
value: {
// Our Intl implementation
},
enumerable: false,
configurable: true,
writable: true,
});
}
globalThis ãå©ç¨å¯è½ã«ãªã£ããããç°ãªãç°å¢éã§ã°ãã¼ãã«ã追å ã§æ¤ç´¢ããå¿
è¦ããªããªãã¾ããã
if (typeof globalThis.Intl === "undefined") {
Object.defineProperty(globalThis, "Intl", {
value: {
// ç¬èªã® Intl å®è£
},
enumerable: false,
configurable: true,
writable: true,
});
}
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-globalthis > |