深入理解var、let、const的异同

文章对比了ES5中的var关键字与ES6引入的let和const关键字在声明变量时的作用域、提升、重复声明以及与全局对象的关系。var声明的变量具有函数作用域或全局作用域并有提升现象,而let和const具有块级作用域,不提升,且const声明的是不可变的常量。let允许重新赋值,const一旦赋值不能修改。同时,let和const不允许在同作用域内重复声明,与var在处理重复声明时的行为不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var是ES5中定义变量的关键字,声明的变量是全局作用域或函数作用域,并且具有提升的特性,也就是说可以在声明之前使用变量。

let和const是ES6中新增的关键字,声明的变量具有块级作用域,只在当前块内有效,不具有提升的特性。let声明的变量可以被重新赋值,而const声明的变量是一个常量,一旦赋值就不能再修改。

(1)作用域

用 var 声明的变量的作用域是它当前的执行上下文,即如果是在任何函数外面,则是全局执行上下文,如果在函数里面,则是当前函数执行上下文。换句话说,var 声明的变量的作用域只能是全局或者整个函数块的。

而 let和const 声明的变量的作用域则是它当前所处代码块,即它的作用域既可以是全局或者整个函数块,也可以是 if、while、switch等用{}限定的代码块。

function varTest() {
  var a = 1;

  {
    var a = 2; // 函数块中,同一个变量
    console.log(a); // 2
  }

  console.log(a); // 2
}

function letTest() {
  let a = 1;

  {
    let a = 2; // 代码块中,新的变量
    console.log(a); // 2
  }

  console.log(a); // 1
}
function constTest() {
    const a = 1;

  {
    const = 2; // 代码块中,新的变量
    console.log(a); // 2
  }

  console.log(a); // 1
}

varTest();
letTest();
constTest();

从上述示例中可以看出,let 声明的变量的作用域可以比 var 声明的变量的作用域有更小的限定范围,更具灵活。

(2)重复声明

var 允许在同一作用域中重复声明,而 let ,const不允许在同一作用域中重复声明,否则将抛出异常。

代码块1:
switch(index) {
  case 0:
    consta = 1;
  break;

  default:
    consta = 2; // SyntaxError: Identifier 'a' has already been declared
    break;
}
代码块2:
switch(index) {
  case 0:
    let a = 1;
  break;

  default:
    let a = 2; // SyntaxError: Identifier 'a' has already been declared
    break;
}
代码块3:
//
var a = 1;
var a = 2;

console.log(a) // 2

function test() {
  var a = 3;
  var a = 4;
  console.log(a) // 4
}

test()

(3)绑定全局对象

var 在全局环境声明变量,会在全局对象里新建一个属性,而 let,const 在全局环境声明变量,则不会在全局对象里新建一个属性。

var a = '你好'
let b = '你好'
const c = '你好'

console.log(this.a) // 你好
console.log(this.b) // undefined
console.log(this.c) // undefined

(4)变量提升与暂存死区



  console.log(a); //暂时性死区,报错 Unexpected identifier 'Uncaught'
        const b = 1;
        console.log(b);


  console.log(a); //暂时性死区,报错 Unexpected identifier 'Uncaught'
        let b = 1;
        console.log(b);


  console.log(a); //undefined
        var = 1;
        console.log(a);
    

变量 a 用 var 声明存在变量提升,所以当脚本开始运行的时候,b 已经存在了,但是还没有赋值,所以会输出 undefined。

变量 b 用 let,const 声明不存在变量提升,在声明变量 a 之前,a 不存在,所以会报错。

const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣在心中度

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值