返回

变量声明界的三角恋——var、let、const的恩怨情仇

前端

在JavaScript的变量声明世界中,var、let和const这三个关键词可谓是家喻户晓,它们是用来声明变量的,但它们之间却存在着微妙的差异,这些差异可能会对你的代码产生意想不到的影响。

var:老牌劲旅,兼容性广泛

var是JavaScript中最传统的变量声明方式,它诞生于JavaScript的早期版本,一直沿用至今。var声明的变量具有以下特点:

  • 声明方式:使用var后跟变量名和赋值,如:
var age = 18;
  • 作用域:var声明的变量的作用域是函数级,即在函数内声明的var变量只能在该函数内使用。

  • 提升行为:var声明的变量会提升至函数顶部,但不会被变量声明覆盖,因此会出现变量提前使用的情况。

function getAge() {
  console.log(age); // undefined
  var age = 18;
}

getAge(); // undefined

let:新贵登场,块级作用域的福音

let是ES6中新引入的变量声明方式,它与var最大的区别在于块级作用域。let声明的变量只在声明所在的块级作用域内有效,块级作用域可以是函数、循环体、if/else语句等。

  • 声明方式:使用let关键字后跟变量名和赋值,如:
let age = 18;
  • 作用域:let声明的变量的作用域是块级,即在块级作用域内声明的let变量只能在该块级作用域内使用。

  • 提升行为:let声明的变量也会提升至块级作用域顶部,但不会被变量声明覆盖,因此不会出现变量提前使用的情况。

function getAge() {
  console.log(age); // ReferenceError: age is not defined
  let age = 18;
}

getAge(); // ReferenceError: age is not defined

const:常量声明,一劳永逸

const也是ES6中新引入的变量声明方式,它与let类似,同样具有块级作用域,但const声明的变量是常量,即不能被重新赋值。

  • 声明方式:使用const关键字后跟变量名和赋值,如:
const age = 18;
  • 作用域:const声明的变量的作用域是块级,即在块级作用域内声明的const变量只能在该块级作用域内使用。

  • 提升行为:const声明的变量也会提升至块级作用域顶部,但不会被变量声明覆盖,因此不会出现变量提前使用的情况。

function getAge() {
  console.log(age); // ReferenceError: age is not defined
  const age = 18;
}

getAge(); // ReferenceError: age is not defined

var、let、const的对比

特征 var let const
声明方式 var关键字 let关键字 const关键字
作用域 函数级 块级 块级
提升行为 会提升至函数顶部,但不会被变量声明覆盖 会提升至块级作用域顶部,但不会被变量声明覆盖 会提升至块级作用域顶部,但不会被变量声明覆盖
能否重新赋值 可以 不可以 不可以

总结

var、let和const都是JavaScript中声明变量的关键字,它们在声明方式、作用域、提升行为和能否重新赋值等方面都有所不同。var是传统变量声明方式,具有函数级作用域和变量提升行为,但允许重新赋值。let是ES6中引入的新变量声明方式,具有块级作用域和变量提升行为,但不允许重新赋值。const也是ES6中引入的新变量声明方式,具有块级作用域和变量提升行为,并且不允许重新赋值。在实际开发中,应根据具体情况选择合适的变量声明方式。