ES6-Let和Const详解
2023-10-23 05:51:12
变量声明
let
let 用于声明变量,其声明的变量具有块级作用域。这意味着变量只在声明它们的代码块内有效,在代码块外将无法访问这些变量。
let a = 10;
{
let b = 20;
console.log(a); // 输出:10
console.log(b); // 输出:20
}
console.log(a); // 输出:10
console.log(b); // 报错:b is not defined
const
const 关键字用于声明常量,其声明的变量是只读的,不能被重新赋值。常量必须在声明时初始化,并且不能在声明后改变其值。
const PI = 3.14;
PI = 3.15; // 报错:Assignment to constant variable.
块级作用域
let 和 const 声明的变量都具有块级作用域。这意味着变量只在声明它们的代码块内有效,在代码块外将无法访问这些变量。
if (true) {
let a = 10;
const b = 20;
}
console.log(a); // 报错:a is not defined
console.log(b); // 报错:b is not defined
变量提升
let 和 const 不会被变量提升。这意味着在使用变量之前,必须先声明它们。
console.log(a); // 报错:a is not defined
let a = 10;
作用域链
作用域链是指变量在当前作用域中找不到时,会依次在父作用域中查找变量的机制。
function outer() {
let a = 10;
function inner() {
console.log(a); // 输出:10
}
inner();
}
outer();
在上面的例子中,变量 a
在 inner()
函数中找不到,因此 inner()
函数会依次在父作用域中查找变量 a
,最终在 outer()
函数中找到变量 a
。
词法作用域
let 和 const 具有词法作用域。这意味着变量的作用域是由代码的结构决定的,而不是由变量的使用位置决定的。
function outer() {
let a = 10;
if (true) {
let a = 20;
console.log(a); // 输出:20
}
console.log(a); // 输出:10
}
outer();
在上面的例子中,变量 a
在 if
语句中重新声明了,但是在 if
语句外仍然可以使用变量 a
,并且变量 a
的值为 10
。这是因为变量 a
在 if
语句中重新声明后,只在 if
语句中有效,在 if
语句外仍然可以使用变量 a
,并且变量 a
的值为 10
。这是因为变量 a
在 if
语句中重新声明后,只在 if
语句中有效,在 if
语句外仍然可以使用变量 a
,并且变量 a
的值为 10
。
变量声明
var
var 关键字用于声明变量,其声明的变量具有全局作用域或函数作用域。这意味着变量可以在声明它们的代码块内以及在代码块外访问。
var a = 10;
function outer() {
var b = 20;
function inner() {
console.log(a); // 输出:10
console.log(b); // 输出:20
}
inner();
}
outer();
let
let 关键字用于声明变量,其声明的变量具有块级作用域。这意味着变量只在声明它们的代码块内有效,在代码块外将无法访问这些变量。
let a = 10;
function outer() {
let b = 20;
function inner() {
console.log(a); // 输出:10
console.log(b); // 输出:20
}
inner();
}
outer();
const
const 关键字用于声明常量,其声明的变量是只读的,不能被重新赋值。常量必须在声明时初始化,并且不能在声明后改变其值。
const PI = 3.14;
PI = 3.15; // 报错:Assignment to constant variable.
比较
特性 | var | let | const |
---|---|---|---|
作用域 | 全局或函数作用域 | 块级作用域 | 块级作用域 |
变量提升 | 是 | 否 | 否 |
只读 | 否 | 否 | 是 |
声明位置 | 可以在代码的任何位置声明 | 必须在代码块的开头声明 | 必须在代码块的开头声明 |
总结
let 和 const 是 ES6 中引入的两个新的关键字,用于声明变量。let 和 const 与 var 有着显著的不同,它们具有块级作用域,并且不会被变量提升。此外,const 声明的变量是只读的,不能被重新赋值。