let globalThis = undefined在浏览器中没有错误let [global, globalThis] = [undefined, undefined]在节点中未显示错误但是let window = undefined抛出SyntaxError
let globalThis = undefined
let [global, globalThis] = [undefined, undefined]
let window = undefined
kpbwa7wx1#
window必须存在,页面(框架)才能工作。由于window是在全局执行上下文中声明的,因此不能使用let或const重新声明它。但是,可以调用以下代码:var window = undefined;或window = undefined;,但它不会对window对象做任何事情。这是因为window对象上的setter是undefined,configurable描述符被设置为false,不允许更改和删除window属性。您可以通过以下代码看到这一点:
window
let
const
var window = undefined;
window = undefined;
undefined
configurable
false
console.log(Object.getOwnPropertyDescriptor(this, 'window'))
您仍然可以在任何其他词法上下文中声明自己的window变量,而不是全局上下文:
const test = () => { const window = 123; console.log('in test fn:', window); } test() console.log('in global:', window)
但是为什么我可以改变globalThis呢?你可以改变它,因为globalThis是window的属性。而且似乎没有空的setter,configurable描述符被设置为true,允许改变这个属性。所有这一切意味着,你可以用globalThis属性做任何你想做的事情:)
globalThis
true
console.log(window.hasOwnProperty('globalThis')); console.log(Object.getOwnPropertyDescriptor(window, 'globalThis'));
1条答案
按热度按时间kpbwa7wx1#
window
必须存在,页面(框架)才能工作。由于window
是在全局执行上下文中声明的,因此不能使用let
或const
重新声明它。但是,可以调用以下代码:
var window = undefined;
或window = undefined;
,但它不会对window
对象做任何事情。这是因为window
对象上的setter是undefined
,configurable
描述符被设置为false
,不允许更改和删除window
属性。您可以通过以下代码看到这一点:您仍然可以在任何其他词法上下文中声明自己的
window
变量,而不是全局上下文:但是为什么我可以改变
globalThis
呢?你可以改变它,因为globalThis
是window
的属性。而且似乎没有空的setter,configurable
描述符被设置为true
,允许改变这个属性。所有这一切意味着,你可以用globalThis
属性做任何你想做的事情:)