有关全局变量/全局名称空间的JavaScript政策

今天,我遇到一个问题,top是一个预先存在的全局变量。

const left = 1;
const right = 2;
const top = 3;
const bottom = 4;
console.log(left,right,top,bottom);

结果:

Uncaught SyntaxError: Identifier 'top' has already been declared

我想直到今天我大多数时候都在使用一个叫做top的变量在函数内部。

我需要担心浏览器添加新的全局变量,这些变量将来会破坏代码吗?直到es6导入,几乎所有浏览器库似乎都使用全局变量,除非它们具有构建步骤。但是,看一下top示例,似乎浏览器可以随时添加新的无法设置的全局变量,因此应不惜一切代价避免使用它们。我看到诸如HTMLElement之类的一些变量是可分配的。

console.log(HTMLElement);
HTMLElement = 'foo';
console.log(HTMLElement);

结果:

function HTMLElement() { [native code] }
foo

top是否有些遗留问题,但是浏览器规格承诺将来不会做更多的事情?就像我无法分配window

const window = 'foo';
console.log(window);

结果:

SyntaxError: Identifier 'window' has already been declared

但是我可以在节点中分配process

Welcome to Node.js v12.6.0.
Type ".help" for more information.
> process
process {
  version: 'v12.6.0',versions: {
    node: '12.6.0',...
}
> process = 'foo'
'foo'
> process
'foo'
> 
qayin123 回答:有关全局变量/全局名称空间的JavaScript政策

我需要担心浏览器添加新的全局变量,这些变量将来会破坏代码吗?

您不必为此担心。 JS和HTML的新功能已经过广泛测试。浏览器通常会部署代码,以监视与计划的API的不兼容性,以确定它们是否可以安全运输。 (例如,如果浏览器想要添加globalThis.foo,则它可能会部署一个计数器,该计数器在每次访问或分配给globalThis.foo的代码时都会递增,以了解其是否已经用于其他用途。此外,浏览器的开发人员预览版可让开发人员在可能的问题解决之前,先将其发现。您可能会发现这很有趣:https://developers.google.com/web/updates/2018/03/smooshgate

话虽如此,我仍然不建议您四处创建很多全局变量,这不是最理想的模式。

最重要的是一些遗留的东西,但是浏览器规格承诺将来不会做更多的事情吗?就像我无法分配窗口

这确实是遗产,尽管我不知道有任何这样的承诺。 HTML标准对window.top的定义如下(来自https://html.spec.whatwg.org/#the-window-object):

[LegacyUnforgeable] readonly attribute WindowProxy? top;

[LegacyUnforgeable]表示属性top是在window上创建的,属性属性configurable设置为false。遮盖不可配置属性的全局声明将失败,因为它们无法更改值。

但是我可以在节点中分配进程

这是因为Node.js中的process是可配置的属性。

> Object.getOwnPropertyDescriptor(globalThis,'process')
{
  get: [Function: get],set: [Function: set],enumerable: false,configurable: true
}

最后一点,赋值和声明之间是有区别的。您仍然可以分配不可配置的属性,只要它们是可写的或提供设置器即可。

本文链接:https://www.f2er.com/2942039.html

大家都在问