var/let/const区别与踩坑记录

var/let/const区别与踩坑记录

因在for循环中碰到了var作用域的问题,特此记录一下var/let/const的区别:

* 1、var为ES5的语法,不存在块级作用域,let/const为ES6语法,存在块级作用域

ES6之前JS中只有全局作用域、函数作用域,没有块作用域的概念。ES6中新增了块级作用域。
块级作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
var 一旦声明即为全局作用域:

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

let/const为块级作用域:

if(true) {
let a = 1;
console.log(a); // 1
}
console.log(a); // 报错 在for语句中同理
if(true) {
const a = 1;
console.log(a); // 1
}
console.log(a); // 报错 在for语句中同理
* 2、var与let都声明变量可以改变,const声明常量不可以改变

但是const声明复合类型常量(如数组,对象等)时,可以修改该复合类型常量的属性,但不能修改该复合类型常量的地址。即:

const a = {
name = 'abc',
age = 18
};
a.name = '123'; // √
a.age = 16;    // √
a = {
name = '456',
age = 20
}  // 报错
* 3、var存在变量提升,let不存在变量提升,即var可以在声明前的位置使用,系统会返回underfind,let如果在声明前使用则会报错

代码中存在var声明变量时,在加载时会把该变量声明提升到全局作用域或函数作用域的头部。

console.log(a); //系统返回undefined
var a = 1;
console.log(a); //系统报错
let a = 1;
* 4、let暂存死区

let为块级作用域,同名的全局变量在let的块级作用域中是取不到值的,会报not defined。

var a= 123;
if (true) {
  a = 1;
  let a;
  console.log(a); // a is not defined
}
* 5、var可以声明同名变量,let与const都不能声明同名变量/常量,否则报错
const a = '123';
a = '456' //报错
* 6、const声明时必须赋值,否则报错
const a = 1 ; //√
const a ; //报错

参考大佬传送门:
https://blog.csdn.net/smaller_coder/article/details/88352296
https://blog.csdn.net/lilongsy/article/details/75048822

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值