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
的价值被覆盖了,这可能不是故意的。
让
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吊装
let
和const
声明不被挂起!
编辑:从技术上讲,它们是吊起的 ,但它们没有初始化为任何内容(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