是的,有一些差异,但实际上它们通常并不大(除了你的#2 -a = 0;
— A) 我强烈建议不要这样做,B) 在严格模式下是一个错误)。
还有第四种方法,从 ES2015 (ES6) 开始还有两种。我在最后添加了第四种方式,但在 #1 之后插入了 ES2015 方式(你会明白为什么),所以我们有:
var a = 0; // 1
let a = 0; // 1.1 (new with ES2015)
const a = 0; // 1.2 (new with ES2015)
a = 0; // 2
window.a = 0; /*or*/ globalThis.a = 0; // 3
this.a = 0; // 4
这些陈述已解释
1. var a = 0;
这将创建一个全局变量,它也是全局对象,我们将其访问为window
在浏览器上(或通过globalThisES2020 中添加了全局,或通过this
在全球范围内)。与其他一些属性不同,该属性无法通过以下方式删除delete
.
在规范方面,它创建了一个标识符绑定 on the 对象环境记录为了全球环境。这使得它成为全局对象的属性,因为全局对象是保存全局环境的对象环境记录的标识符绑定的地方。这就是属性不可删除的原因:它不仅仅是一个简单的属性,它是一个标识符绑定,并且标识符无法被删除。
绑定(变量)是在第一行代码运行之前定义的(请参阅“当var
发生”如下)。
它创建的属性是可枚举的(除了非常过时的 IE8 及更早版本)。
1.1 let a = 0;
这将创建一个全局变量,它是not全局对象的属性。这是 ES2015 中的新事物。
用规范术语来说,它创建了一个绑定在声明式环境记录为了全球环境而不是为了Object环境记录。全球环境的独特之处在于分裂环境记录,一个用于全局对象上的所有旧内容(Object环境记录)和另一个所有新东西(let
, const
,以及创建的函数class
)不在全局对象上,而是在全局环境中声明式相反,环境记录。
绑定是created在执行其封闭块中的任何分步代码之前(在本例中,在任何全局代码运行之前),但它不是无障碍以任何方式直到逐步执行达到let
陈述。一旦执行达到let
语句,该变量是可访问的。 (参见“当let
and const
发生”下面。) 绑定之间的时间created(进入范围时)并成为无障碍(代码执行达到let
)被称为颞死区[TMZ]。当绑定处于该状态时,任何对其进行读取或写入的尝试都是运行时错误。
(规范中关于绑定是否可访问的术语是它是否已“初始化”,但不要将“初始化”的使用与在let
陈述 [let a = 10;
与只是let a;
];他们是无关的。定义的变量let a;
初始化为undefined
一旦let
到达了。)
1.2 const a = 0;
创建一个全局常量,它不是全局对象的属性。
A const
绑定就像let
绑定(包括 TMZ 等),但它有一个标志表明其值不能更改。这意味着您必须提供一个初始化程序(= value
部分)提供初始(且不变)值const
.
Using const
为你做三件事:
- 如果您尝试分配给常量,则会导致运行时错误(大多数 IDE 会比这更主动地为您标记它)。
- 为其他程序员记录其不变的性质。
- 让 JavaScript 引擎在此基础上进行优化
const
的值不会改变(不必跟踪它是否稍后写入 - 例如,不必检查它是否是有效地持续的)。
重要的是要明白const
的值永远不会改变并不意味着一个对象const
指的是不可变的。事实并非如此。这仅仅意味着const
无法更改,因此它指的是不同的对象(或包含原语):
// This is fine:
const x1 = {a: 1};
console.log(x1.a); // 1
x1.a = 2;
//^^^^^^−−− No problem, just changing the object's state, not the value in the `const` (the object reference)
console.log(x1.a); // 2
// This is not:
const x2 = {a: 1};
console.log(x2.a); // 1
x2 = {a: 2};
// ^−−−−−−− Error here ("TypeError: Assignment to constant variable"),
// you can't change the value of a `const`
console.log(x2.a);
2 a = 0;
不要这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)