Skip to content

JavaScript中var、let和const之间的区别是什么?

JavaScript有三种变量声明语句:varletconst。后两者是在ES6中添加的,而var存在于之前的版本中。首先要注意的一点是,const定义常量(即不会被重新赋值的值),而varlet定义变量。然而,var在各种其他方面与letconst的行为不同。

作用域

使用var声明的变量是函数作用域的,而使用letconst声明的变量是块级作用域的。

const scopeExample = () => {
  var a = 'var';
  let b = 'let';
  console.log(a, b); // 'var', 'let'

  {
    var c = 'var';
    let d = 'let';
    console.log(c, d); // 'var', 'let'
  }

  console.log(c); // 'var'
  console.log(d); // 抛出ReferenceError错误
};

如果你想了解更多信息,我们有一篇更深入地介绍JavaScript变量和作用域的文章

提升

使用var声明的变量会被提升到封闭的作用域中,而使用letconst声明的变量在其定义被评估之前不会被初始化。

const hoistingExample = () => {
  console.log(a); // undefined
  var a = 'var';
  console.log(a); // 'var'

  console.log(b); // ReferenceError
  let b = 'let';
  console.log(b); // 'let'
};

如果你想了解更多,我们有一篇更深入讲解JavaScript变量提升的文章

全局对象属性

在顶层作用域中,使用var声明的变量(与使用letconst声明的变量不同)会在全局对象上创建一个属性。

var a = 'var';
let b = 'let';

console.log(window.a); // 'var'
console.log(window.b); // undefined

重新声明

在严格模式下,使用var声明的变量可以在同一作用域中重新声明,而对于使用letconst声明的变量则不允许重新声明。

'use strict';
var a = 'var1';
var a = 'var2';

```javascript
let b = 'let1';
let b = 'let2'; // SyntaxError

如果你想了解更多,我们有一篇更深入介绍JavaScript严格模式的文章