返回

Var,Let 和 Const,ES6变量的三角之争

前端

JavaScript 的变与不变

在 ES6 之前,JavaScript 只有一个变量声明var。它允许我们在代码的任何地方声明变量,并且这些变量在整个作用域内都有效。

//使用 var 声明变量
var myName = "John Doe";
console.log(myName); // "John Doe"

//在函数内部声明变量
function sayHello() {
  var message = "Hello, world!";
  console.log(message); // "Hello, world!"
}

//在代码块内部声明变量
{
  var temp = "This is a temporary variable";
  console.log(temp); // "This is a temporary variable"
}

//在全局作用域声明变量
var globalVariable = "This is a global variable";
console.log(globalVariable); // "This is a global variable"

然而,var 存在一个问题:变量提升(Variable Hoisting)。当使用 var 声明变量时,变量会被提升到作用域的顶部。这意味着,即使你在代码的后面声明变量,你也可以在前面的代码中使用它。

//使用 var 声明变量并进行变量提升
console.log(myName); // undefined
var myName = "John Doe";

//在函数内部声明变量并进行变量提升
function sayHello() {
  console.log(message); // undefined
  var message = "Hello, world!";
}

//在代码块内部声明变量并进行变量提升
{
  console.log(temp); // undefined
  var temp = "This is a temporary variable";
}

//在全局作用域声明变量并进行变量提升
console.log(globalVariable); // undefined
var globalVariable = "This is a global variable";

变量提升可能会导致代码的执行结果与你预期的不一致。为了解决这个问题,ES6 引入了两个新的变量声明:letconst

Let 的登场

let 关键字用于声明块级作用域变量。这意味着,使用 let 声明的变量只在它所在的代码块内有效。

//使用 let 声明块级作用域变量
let myName = "John Doe";
console.log(myName); // "John Doe"

//在函数内部声明块级作用域变量
function sayHello() {
  let message = "Hello, world!";
  console.log(message); // "Hello, world!"
}

//在代码块内部声明块级作用域变量
{
  let temp = "This is a temporary variable";
  console.log(temp); // "This is a temporary variable"
}

//在全局作用域声明块级作用域变量
let globalVariable = "This is a global variable";
console.log(globalVariable); // "This is a global variable"

var 不同,let 不存在变量提升。这意味着,你必须在使用 let 声明的变量之前先声明它。

//尝试在使用 let 声明的变量之前使用它
console.log(myName); // ReferenceError: myName is not defined
let myName = "John Doe";

//尝试在函数内部使用 let 声明的变量之前使用它
function sayHello() {
  console.log(message); // ReferenceError: message is not defined
  let message = "Hello, world!";
}

//尝试在代码块内部使用 let 声明的变量之前使用它
{
  console.log(temp); // ReferenceError: temp is not defined
  let temp = "This is a temporary variable";
}

//尝试在全局作用域使用 let 声明的变量之前使用它
console.log(globalVariable); // ReferenceError: globalVariable is not defined
let globalVariable = "This is a global variable";

let 关键字还可以用于重新声明变量。这意味着,你可以在同一个代码块内多次声明同一个变量,但每次声明都需要使用不同的值。

//使用 let 重新声明变量
let myName = "John Doe";
console.log(myName); // "John Doe"

myName = "Jane Doe";
console.log(myName); // "Jane Doe"

let message = "Hello, world!";
console.log(message); // "Hello, world!"

message = "Goodbye, world!";
console.log(message); // "Goodbye, world!"

Const 的登场

const 关键字用于声明常量变量。这意味着,使用 const 声明的变量的值一旦被赋值,就不能再被改变。

//使用 const 声明常量变量
const myName = "John Doe";
console.log(myName); // "John Doe"

//尝试改变 const 声明的变量的值
myName = "Jane Doe";
console.log(myName); // TypeError: Assignment to constant variable.

//在函数内部声明常量变量
function sayHello() {
  const message = "Hello, world!";
  console.log(message); // "Hello, world!"
}

//尝试改变 const 声明的变量的值
message = "Goodbye, world!";
console.log(message); // TypeError: Assignment to constant variable.

//在代码块内部声明常量变量
{
  const temp = "This is a temporary variable";
  console.log(temp); // "This is a temporary variable"
}

//尝试改变 const 声明的变量的值
temp = "This is a new temporary variable";
console.log(temp); // TypeError: Assignment to constant variable.

//在全局作用域声明常量变量
const globalVariable = "This is a global variable";
console.log(globalVariable); // "This is a global variable"

//尝试改变 const 声明的变量的值
globalVariable = "This is a new global variable";
console.log(globalVariable); // TypeError: Assignment to constant variable.

let 一样,const 也不存在变量提升。这意味着,你必须在使用 const 声明的变量之前先声明它。

//尝试在使用 const 声明的变量之前使用它
console.log(myName); // ReferenceError: myName is not defined
const myName = "John Doe";

//尝试在函数内部使用 const 声明的变量之前使用它
function sayHello() {
  console.log(message); // ReferenceError: message is not defined
  const message = "Hello, world!";
}

//尝试在代码块内部使用 const 声明的变量之前使用它
{
  console.log(temp); // ReferenceError: temp is not defined
  const temp = "This is a temporary variable";
}

//尝试在全局作用域使用 const 声明的变量之前使用它
console.log(globalVariable); // ReferenceError: globalVariable is not defined
const globalVariable = "This is a global variable";

Var,Let 和 Const 的比较

特性 var let const
作用域 全局或函数 块级 块级
变量提升 存在 不存在 不存在
重新声明 可以 可以 不可以
改变值 可以 可以 不可以

如何选择合适的变量声明关键字

在选择变量声明关键字时,你需要考虑以下因素:

  • 变量的作用域 :你想让变量在什么范围内有效?
  • 变量是否需要被重新声明 :你是否需要在同一个代码块内多次声明同一个变量?
  • 变量的值是否需要被改变 :变量的值是否需要在声明之后被改变?

一般的规则如下:

  • 如果变量需要在全局或函数范围内有效,且不需要被重新声明或改变值,则使用 var
  • 如果变量需要在块级作用域内有效,且不需要被重新声明或改变值,则使用 let
  • 如果变量需要在块级作用域内有效,且需要被重新声明或改变值,则使用 const

结论

varletconst 是 ES6 中用于声明变量的三个关键字。它们的区别在于作用域、变量提升和是否可以被重新声明或改变值。在选择变量声明关键字时,你需要考虑变量的作用域、是否需要被重新声明以及是否需要被改变值。