其他|Javascript 获取全局对象
Javascript 获取全局对象
全局属性 globalThis在
在以前,从不同的 JavaScript 环境中获取全局对象需要不同的语句。在 Web 中,可以通过window
、self
或者frames
取到全局对象,但是在 Web Workers 中,只有self
可以。在 Node.js 中,它们都无法获取,必须使用global
。
【其他|Javascript 获取全局对象】在松散模式下,可以在函数中返回this
来获取全局对象,但是在严格模式和模块环境下,this
会返回undefined
。 You can also useFunction('return this')()
, but environments that disableeval()
, like CSP in browsers, prevent use ofFunction
in this way.
globalThis
提供了一个标准的方式来获取不同环境下的全局this
对象(也就是全局对象自身)。不像window
或者self
这些属性,它确保可以在有无窗口的各种环境下正常工作。所以,你可以安心的使用globalThis
,不必担心它的运行环境。为便于记忆,你只需要记住,全局作用域中的this
就是globalThis
。
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 方法!
}
zloirock 对于全局对象的看法
https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
Browsers | ~IE8 | Node | NW | Web Workers | VM | FF extensions | |
---|---|---|---|---|---|---|---|
self |
yes | broken after changing document.domain |
yes | broken | |||
window |
yes | yes | yes | broken | broken | ||
global |
yes | broken | |||||
Function('return this')() |
breaks CSP | yes | yes | yes | breaks CSP | yes | yes |
"use strict";
var commonjsGlobal =
typeof globalThis !== "undefined"
? globalThis
: typeof window !== "undefined"
? window
: typeof global !== "undefined"
? global
: typeof self !== "undefined"
? self
: {};
var O = "object";
var check = function (it) {
return it && it.Math == Math && it;
};
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global_1 =
// eslint-disable-next-line no-undef
check(typeof globalThis == O && globalThis) ||
check(typeof window == O && window) ||
check(typeof self == O && self) ||
check(typeof commonjsGlobal == O && commonjsGlobal) ||
// eslint-disable-next-line no-new-func
Function("return this")();
推荐阅读
- 对抗抑郁最好的方法
- 事件代理
- 数组常用方法一
- EditText默认不获取焦点弹出键盘
- whlie循环和for循环的应用
- 15、IDEA学习系列之其他设置(生成javadoc、缓存和索引的清理等)
- java静态代理模式
- 【实用教程】4种获取无水印视频素材的方法
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查