var、let和const声明变量的区别
一、var 的使用
1.1、var 声明变量的作用域
var可以在全局范围声明
或者函数范围内声明
。
1、当在最外层函数的外部用var声明,作用域是全局的。
这意味着在最外层函数的外部用var声明的任何变量都可以在windows中使用。
2、当在函数中声明var时,作用域是局部的。
这意味着它只能在函数内访问。
示例
var greeter = 'hey hi'; //都可以在windows中
function newFunction() {
var hello = 'hello'; //只能在函数内访问
}
这里,greeter是全局范围的,因为它存在于函数外部
而hello是函数范围的。因此,我们无法在函数外部访问变量hello。
1.2、var 变量可以重新声明
和修改
这意味着我们可以在相同的作用域内执行下面的操作,并且不会出错
var greeter = 'hey hi';
var greeter = 'say Hello instead';
又比如
var greeter = 'hey hi';
greeter = 'say Hello instead';
1.3、var 的变量提升
变量提升是 JavaScript 的一种机制:在执行代码之前,变量和函数声明会移至其作用域的顶部。这意味着如果我们这样做:
console.log(greeter); // greeter is undefined
var greeter = 'say hello';
变量提升后--代码会被解释为
var greeter;
console.log(greeter); // greeter is undefined
greeter = 'say hello';
因此,将var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化
二、let 的使用
2.1、let 是块级作用域
块是由{}
界定的代码块,大括号中有一个块。大括号内的任何内容都包含在一个块级作用域中,因此,在带有let
的块中声明的变量仅可在该块中使用。让我用一个例子解释一下:
if (times > 3) {
let hello = 'say Hello instead';
console.log(hello); // "say Hello instead"
}
console.log(hello); // hello is not defined
我们看到在其代码块(定义它的花括号)之外使用hello会返回错误。这是因为let变量是块范围的
2.2、let 可以被修改但是不能被重新声明
就像var一样,用 let声明的变量可以在其范围内被修改。但与var不同的是,let变量无法在其作用域内被重新声明。 来看下面的例子:
let greeting = 'say Hi';
let greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared
但是,如果在不同的作用域中定义了相同的变量,则不会有错误:
let greeting = 'say Hi';
if (true) {
let greeting = 'say Hello instead';
console.log(greeting); // "say Hello instead"
}
console.log(greeting); // "say Hi"
这个事实说明:使用let,是比var更好的选择。当使用let时,你不必费心思考变量的名称,因为变量仅在其块级作用域内存在。
同样,由于在一个块级作用域内不能多次声明一个变量,因此不会发生前面讨论的var出现的问题。
2.3、let 的变量提升
就像var一样,let声明也被提升到作用域顶部。
但不同的是:
1、用var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化。
image.png2、用let声明的变量会被提升到其作用域的顶部,不会对值进行初始化。
因此,如果你尝试在声明前使用let变量,则会收到Reference Error。
三、const 的使用
3.1、const 声明的变量在块级作用域内
像let声明一样,const声明只能在声明它们的块级作用域中访问。
3.2、const 不能被修改并且不能被重新声明
这意味着用const声明的变量的值保持不变。不能修改或重新声明。因此,如果我们使用const声明变量,那么我们将无法做到这一点:
const greeting = 'say Hi';
greeting = 'say Hello instead'; // error: Assignment to constant variable.
或者这个这样:
const greeting = 'say Hi';
const greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared
因此,每个const声明都必须在声明时进行初始化。
当用const声明对象时,这种行为却有所不同。虽然不能更新const对象,但是可以更新该对象的属性。 因此,如果我们声明一个const对象为
const greeting = {
message: 'say Hi',
times: 4,
};
同样不能像下面这样做:
const greeting = {
words: 'Hello',
number: 'five',
}; // error: Assignment to constant variable.
但我们可以这样做:
greeting.message = 'say Hello instead';
这将更新greeting.message的值,而不会返回错误。
3.3、const 的变量提升
就像let一样,const声明也被提升到顶部,但是没有初始化。
四、var、let、const 区别总结
1、var声明是全局作用域或函数作用域,而let和const是块作用域。
2、var变量可以重新赋值和重新声明;
let变量可以重新赋值但不能重新声明;
const变量既重新赋值也不能重新声明。
3、它们都被提升到其作用域的顶端
但是,虽然使用变量undefined初始化了var变量,但未初始化let和const变量
因此let const 如果先使用后声明会报错。
4、var和let声明可以不初始化,const在声明期间必须初始化