var、let、const 区别
var、let 声明变量
区别:
1.作用域
// 块级区域 { var a=10; let b=20; } console.log(a); //10 console.log(b); //引用错误 b is not defined
可以看到,var声明在块级区域以外有效,是可以获取到的,而let声明出了块级区域就无效了。
var声明具有变量提升能力,无论在哪声明,均作为顶部声明(全局有效)。
let声明不具变量提升能力,离开块级区域,变量即刻失效。
2.逻辑
在声明前使用
console.log(a); //undefined var a; console.log(b); //Cannot access 'b' before initialization let b;
var 变量提升而导致逻辑怪异,在声明前后使用都为undefined
let 声明后使用为undefined,声明前使用返回引用错误
3.暂时性死区
if(true){ // 死区start val=10; console.log(10); //10 // 死区end let val; //引用错误 }
使用let声明,引用错误,在声明之前的区域将为死区,即必须按照规范让声明在前。
使用var声明,返回 10,但以逻辑来看是不正确的。
4.重复声明
var val=10; var val=200; console.log(val); //200 let val=10; let val=200; console.log(val); //引用错误
var可重复声明同一个变量,后声明的值覆盖前一个值
let不可重复声明同一变量,直接报错
即便同var一起声明,也会报错,只要使用let声明变量,该变量不能声明第二次
let val=10; var val=200; console.log(val);
![]()
若分别处于作用域内外两部分,则是可以并存的
let val=10; { let val=20; console.log(val); //20 } console.log(val); //10
在循环中分别使用var let
- var是作用于全局的,如果后续再使用就会引起干扰
for (var i = 0; i < 3; i++) { console.log(i); //0 1 2 } console.log(i); //3
- let只在循环内有效,循环作为作用域,在循环外是获取不到的,防止干扰
for (let i = 0; i < 3; i++) { console.log(i); //0 1 2 } console.log(i); //错误
遍历数组
var arr=[]; for (var i = 0; i < 3; i++) { arr[i]=function(){ console.log(i); } } arr[1](); //无论设置多少,均为3 for (let i = 0; i < 3; i++) { arr[i]=function(){ console.log(i); } } arr[2](); //可设置索引得到需要的值
const 声明只读常量,常量约定俗成字母大写
-
值不可以更改,改变则报错
const A=10;
A=100;
console.log(A);
![]()
-
一旦声明即刻赋值,否则报错
const A; A=10; console.log(A);
![]()
-
同let声明,声明的常量无法提升,有暂存死区
console.log(A); //Cannot access 'A' before initialization
const A=10;
![]()

浙公网安备 33010602011771号