javascript 为什么你可以重新定义globalThis和global而不能重新定义window?

wkyowqbh  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(166)

let globalThis = undefined在浏览器中没有错误
let [global, globalThis] = [undefined, undefined]在节点中未显示错误
但是let window = undefined抛出SyntaxError

kpbwa7wx

kpbwa7wx1#

window必须存在,页面(框架)才能工作。由于window是在全局执行上下文中声明的,因此不能使用letconst重新声明它。
但是,可以调用以下代码:var window = undefined;window = undefined;,但它不会对window对象做任何事情。这是因为window对象上的setter是undefinedconfigurable描述符被设置为false,不允许更改和删除window属性。您可以通过以下代码看到这一点:

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呢?你可以改变它,因为globalThiswindow的属性。而且似乎没有空的setter,configurable描述符被设置为true,允许改变这个属性。所有这一切意味着,你可以用globalThis属性做任何你想做的事情:)

console.log(window.hasOwnProperty('globalThis'));
console.log(Object.getOwnPropertyDescriptor(window, 'globalThis'));

相关问题