返回

Var、Let、Const:洞悉 JS 变量声明的精髓

前端

在 JavaScript 的世界里,变量声明是编程的基础。无论是经验丰富的开发人员还是初出茅庐的新手,掌握 var、let 和 const 这三个的使用方法对于编写健壮且可维护的代码都是至关重要的。

1. var:万能的变量声明

var 是 JavaScript 中最古老的变量声明关键字,也是最不严格的。使用 var 声明的变量具有函数级作用域,这意味着它们在声明所在的函数或全局上下文中都是可见的。

var name = "John Doe";

function greet() {
  var greeting = "Hello, " + name;
  console.log(greeting);
}

greet(); // 输出: Hello, John Doe

2. let:块级作用域的宠儿

let 是 ES6 中引入的变量声明关键字,它带来了块级作用域的概念。使用 let 声明的变量只在声明所在的块级作用域内可见,块级作用域可以是函数体、循环体或条件语句体。

let name = "Jane Doe";

if (name === "Jane Doe") {
  let greeting = "Hello, " + name;
  console.log(greeting); // 输出: Hello, Jane Doe
}

console.log(greeting); // ReferenceError: greeting is not defined

在上面的示例中,由于 greeting 是在 if 块级作用域内声明的,因此它只在该块级作用域内可见。一旦离开该块级作用域,greeting 就无法被访问,因此在 console.log(greeting) 语句中会抛出 ReferenceError 异常。

3. const:常量的力量

const 也是 ES6 中引入的变量声明关键字,它用于声明常量,即值不可变的变量。使用 const 声明的变量必须在声明时初始化,并且一旦初始化就不能被重新赋值。

const PI = 3.14159265;

PI = 3.14; // TypeError: Assignment to constant variable.

在上面的示例中,由于 PI 是使用 const 声明的常量,因此无法重新赋值。尝试重新赋值会抛出 TypeError 异常。

4. 暂时性死区:变量声明的微妙陷阱

在 JavaScript 中,变量声明会经历一个暂时性死区(temporal dead zone),在这个死区内,变量名是不可访问的。暂时性死区从变量声明开始,直到执行该声明所在的块级作用域为止。

console.log(name); // ReferenceError: name is not defined

let name = "John Doe";

在上面的示例中,由于 name 是在 let 语句中声明的,因此在 let 语句执行之前,name 是不可访问的。因此,console.log(name) 语句会抛出 ReferenceError 异常。

5. 闭包:变量作用域的延伸

闭包是 JavaScript 中的一项强大特性,它允许函数访问其创建时所在作用域中的变量,即使该函数已经离开该作用域。

function outer() {
  let name = "John Doe";

  function inner() {
    console.log(name); // 输出: John Doe
  }

  return inner;
}

const innerFunction = outer();
innerFunction();

在上面的示例中,函数 inner 是一个闭包,它可以访问其创建时所在作用域中的变量 name,即使 inner 函数已经离开该作用域。

总结

var、let 和 const 是 JavaScript 中用于声明变量的三种关键字,它们具有不同的作用域和特性。理解这三个关键字的差异对于编写健壮且可维护的代码至关重要。