var,let或const?

ES6简介

您必须了解var才能掌握let / const的好处。 让我们倒带。

评论:变量声明

重要的是,请使用var故意在特定范围声明变量,以使代码清晰易维护。

var x = "outside";
function foo() {
var x = "inside";
console.log(x);
}
foo(); // inside
console.log(x); // outside

上面的代码使用var在函数的内部和外部正确声明了x foo没有var会发生什么?

var x = "outside";
function foo() {
x = "inside";
console.log(x);
}
foo(); // inside
console.log(x); // inside

哦哦! x之外的功能被覆盖x里面的功能,因为我们没有指定x是只作用域 foo

吊装最佳实践

在当前作用域的顶部使用var声明变量。

好:

console.log('sup')
var i = 0;

更好:

var i = 0;
console.log('sup')

点评:吊装

使用声明的变量var始终悬挂在其范围的顶部。

console.log(j); // ReferenceError: j is not defined
console.log(i); // undefined
var i = 0;

从未声明变量 j ,因此我们收到一个错误消息:“我从未听说过j !”。

由于吊装 i 宣布前被宣布 解释器的执行方式如下:

var i;
console.log(i);
i = 0;

解释器将变量声明移动(例如“吊起”)了作用域的顶部。

但是,该变量尚未 分配0 undefined表示“我知道i 存在 ,但我不知道i 指的是什么值因为您没有分配给任何东西”。

补充1:如果使用 var 指功能
附录2:吊装不会实际“移动”您的代码— MDN

功能范围

var作用域是 作用域仅限于其定义的功能。

function foo() {
var i = 0;
}
console.log(i); // ReferenceError: i is not defined

i只存在于foo所以我们得到一个错误:“我从未听说过i !”。

区块范围

var 阻止范围的 :范围不限于它在定义的块。

var i = 0
if (true) {
var i = 1;
}
console.log(i); // 1

i 仍然,如果块内的“全球范围内”。 i价值被覆盖了,这可能不是故意的。

var,let或const?

let变量成为 块作用域 具体范围=更少的错误。

let i = 0;
if (true) {
let i = 1;
}
console.log(i); // 0

即使在if块中将i 分配1 ,该分配对于该也是局部的,因此我们的“全局” i仍为0 if块的作用域与全局作用域是分开的。

const ==常数

const限制重写变量。

const i = 0;
i = 1; // TypeError: Assignment to constant variable.

const甚至不允许您在不分配变量(常量)的情况下声明变量!

const i; // SyntaxError: Missing initializer in const declaration

let一样, const块作用域的

if (true) {
const i = 0;
}
console.log(i); // ReferenceError: i is not defined

const 确实允许变量突变 (只有对象/数组在JS中是可变的)。

数组变异:

const a = [1];
const b = a;
console.log(a === b); // true
b.push(2);
console.log(a === b); // true
console.log(a); /// [ 1, 2 ]

对象变异:

const obj = {};
obj.i = 1;
console.log(obj); // { i: 1 }

let / const吊装

letconst声明不被挂起!

编辑:从技术上讲,它们是吊起的 ,但它们没有初始化为任何内容( var初始化为undefined )。
console.log(a); // undefined
var a = 2;
console.log(b); // Uncaught ReferenceError: b is not defined
console.log(c); // Uncaught ReferenceError: c is not defined
let c = 2;

这样可以防止在引用变量之后放置变量声明

isEqualTo5有一个错误-始终返回true

function isEqualTo5(n) {
return !(n - five);
var five = 5;
}
console.log(isEqualTo5(4)); // true

问题是直到被引用后才分配five 宣布所以当它在return语句引用,它的价值是undefined

!(4 - undefined) === !(NaN) === true

该错误可能很难捕获。 let / const来解救!

function isEqualTo5(n) {
return !(n - five);
const five = 5;
}
console.log(isEqualTo5(4)); // ReferenceError: five is not defined

const不会取消声明→错误:声明之前的引用→防止错误。

特定范围=更少的错误+改进的可读性/可维护性。

TLDR: var →????,您可以在const处使用const ,否则let也要冷静! ????

From: https://hackernoon.com/js-var-let-or-const-67e51dbb716f