Var、Let、Const:洞悉 JS 变量声明的精髓
2023-11-28 20:46:16
在 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 中用于声明变量的三种关键字,它们具有不同的作用域和特性。理解这三个关键字的差异对于编写健壮且可维护的代码至关重要。