ES6中let的作用以及与var的区别
在 ES6 中,let 是用于声明变量的关键字,它解决了 var 的一些问题,并引入了块级作用域的概念。以下是 let 的作用及其与 var 的主要区别:
let 的作用
-
块级作用域
let声明的变量只在当前代码块(如{}内部)有效,超出块级作用域后无法访问。- 代码块可以是
if、for、while等语句的{},也可以是单独的{}。
-
避免变量提升
let声明的变量不会像var那样被提升到作用域顶部,在声明之前访问会抛出ReferenceError。
-
防止重复声明
- 在同一作用域内,
let不允许重复声明同名变量,否则会抛出SyntaxError。
- 在同一作用域内,
-
更适合循环和闭包
- 在循环中使用
let可以避免var导致的闭包问题。
- 在循环中使用
let 与 var 的区别
| 特性 | let | var |
|---|---|---|
| 作用域 | 块级作用域({} 内部有效) | 函数作用域(整个函数内部有效) |
| 变量提升 | 不会提升,存在“暂时性死区” | 会提升,声明前值为undefined |
| 重复声明 | 不允许重复声明 | 允许重复声明 |
| 全局作用域行为 | 不会成为全局对象的属性 | 会成为全局对象的属性(如window) |
| 循环中的行为 | 每次迭代都会创建一个新的绑定 | 共享同一个绑定 |
示例对比
- 作用域
// var 的例子
if (true) {
var x = 10;
}
console.log(x); // 输出 10,var 没有块级作用域
// let 的例子
if (true) {
let y = 20;
}
console.log(y); // 报错:y is not defined,let 有块级作用域
- 变量提升
// var 的例子
console.log(a); // 输出 undefined,变量提升
var a = 5;
// let 的例子
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 10;
- 重复声明
// var 的例子
var c = 1;
var c = 2; // 不会报错
// let 的例子
let d = 1;
let d = 2; // 报错:SyntaxError: Identifier 'd' has already been declared
- 全局作用域行为
// var 的例子
var e = 100;
console.log(window.e); // 输出 100,var 声明的变量会成为全局对象的属性
// let 的例子
let f = 200;
console.log(window.f); // 输出 undefined,let 声明的变量不会成为全局对象的属性
- 循环中的行为
// var 的例子
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 输出 3, 3, 3,var 共享同一个绑定
}
// let 的例子
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 100); // 输出 0, 1, 2,let 每次迭代都会创建新的绑定
}
暂时性死区(Temporal Dead Zone, TDZ)
- 在
let声明之前,变量处于“暂时性死区”,访问它会抛出ReferenceError。 - 例如:
console.log(g); // 报错:Cannot access 'g' before initialization let g = 30;
总结
let的优点:- 块级作用域,避免变量污染。
- 不存在变量提升,更符合直觉。
- 不允许重复声明,减少错误。
- 更适合循环和闭包场景。
- 使用建议:
- 在现代 JavaScript 开发中,优先使用
let和const,避免使用var。 - 如果需要声明常量,使用
const;如果需要修改变量,使用let。
- 在现代 JavaScript 开发中,优先使用
更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github