globalThis
åºçº¿
广æ³å¯ç¨
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
å
¨å±å±æ§ globalThis å
å«å
¨å±ç this å¼ï¼ç±»ä¼¼äºå
¨å±å¯¹è±¡ï¼global objectï¼ã
å°è¯ä¸ä¸
function canMakeHTTPRequest() {
return typeof globalThis.XMLHttpRequest === "function";
}
console.log(canMakeHTTPRequest());
// Expected output (in a browser): true
globalThis ç屿§ç¹æ§ | |
|---|---|
| å¯å | æ¯ |
| 坿䏾 | å¦ |
| å¯é ç½® | æ¯ |
è¯æ³
globalThis
æè¿°
å¨ä»¥åï¼ä»ä¸åç JavaScript ç¯å¢ä¸è·åå
¨å±å¯¹è±¡éè¦ä¸åçè¯å¥ãå¨ Web ä¸ï¼å¯ä»¥éè¿ windowãself æè
frames åå°å
¨å±å¯¹è±¡ï¼ä½æ¯å¨ Web Workers ä¸ï¼åªæ self å¯ä»¥ãå¨ Node.js ä¸ï¼å®ä»¬é½æ æ³è·åï¼å¿
é¡»ä½¿ç¨ globalã
卿¾æ£æ¨¡å¼ä¸ï¼å¯ä»¥å¨å½æ°ä¸è¿å this æ¥è·åå
¨å±å¯¹è±¡ï¼ä½æ¯å¨ä¸¥æ ¼æ¨¡å¼å模åç¯å¢ä¸ï¼this ä¼è¿å undefinedãä½ ä¹å¯ä»¥ä½¿ç¨ Function('return this')()ï¼ä½é£äºç¦ç¨eval()çç¯å¢ï¼å¦å¨æµè§å¨ä¸çCSPï¼ä¸å
è®¸è¿æ ·ä½¿ç¨Functionã
globalThis æä¾äºä¸ä¸ªæ åçæ¹å¼æ¥è·åä¸åç¯å¢ä¸çå
¨å± this 对象ï¼ä¹å°±æ¯å
¨å±å¯¹è±¡èªèº«ï¼ãä¸å window æè
self è¿äºå±æ§ï¼å®ç¡®ä¿å¯ä»¥å¨ææ çªå£çåç§ç¯å¢ä¸æ£å¸¸å·¥ä½ãæä»¥ï¼ä½ å¯ä»¥å®å¿çä½¿ç¨ globalThisï¼ä¸å¿
æ
å¿å®çè¿è¡ç¯å¢ã为便äºè®°å¿ï¼ä½ åªéè¦è®°ä½ï¼å
¨å±ä½ç¨åä¸ç this å°±æ¯ globalThisã
HTML ä¸ WindowProxy
å¨å¾å¤å¼æä¸ï¼ globalThis 被认为æ¯çå®çå
¨å±å¯¹è±¡çå¼ç¨ï¼ä½æ¯å¨æµè§å¨ä¸ï¼ç±äº iframe 以åè·¨çªå£å®å
¨æ§çèèï¼å®å®é
å¼ç¨çæ¯çå®å
¨å±å¯¹è±¡ï¼ä¸å¯ä»¥è¢«ç´æ¥è®¿é®ï¼ç Proxy 代çãå¨é常çåºç¨ä¸ï¼å¾å°ä¼æ¶åå°ä»£çä¸å¯¹è±¡æ¬èº«çåºå«ï¼ä½æ¯ä¹éè¦å 以注æã
å½å
并没æéç¨ä¸äºæ´å¸¸è§çå½åæ¹å¼ï¼å¦ self å globalï¼è¿æ¯ä¸ºäºé¿å
å½±åç°å代ç çå
¼å®¹æ§ãæ´å¤ç¸å
³ä¿¡æ¯å¯ä»¥æ¥ç language proposal's "naming" document ã
示ä¾
å¨ globalThis ä¹åï¼è·åæä¸ªå
¨å±å¯¹è±¡çå¯ä¸æ¹å¼å°±æ¯ Function('return this')()ï¼ä½æ¯è¿å¨æäºæ
åµä¸ä¼è¿å CSP è§åï¼æä»¥ï¼es6-shim 使ç¨äºç±»ä¼¼å¦ä¸çæ¹å¼ï¼
var getGlobal = function () {
if (typeof self !== "undefined") {
return self;
}
if (typeof window !== "undefined") {
return window;
}
if (typeof global !== "undefined") {
return global;
}
throw new Error("unable to locate global object");
};
var globals = getGlobal();
if (typeof globals.setTimeout !== "function") {
// æ¤ç¯å¢ä¸æ²¡æ setTimeout æ¹æ³ï¼
}
使¯æäº globalThis ä¹åï¼åªéè¦ï¼
if (typeof globalThis.setTimeout !== "function") {
// æ¤ç¯å¢ä¸æ²¡æ setTimeout æ¹æ³ï¼
}
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-globalthis> |