ES6中let的作用以及与var的区别

98 阅读3分钟

ES6中let的作用以及与var的区别

在 ES6 中,let 是用于声明变量的关键字,它解决了 var 的一些问题,并引入了块级作用域的概念。以下是 let 的作用及其与 var 的主要区别:

let 的作用

  1. 块级作用域

    • let 声明的变量只在当前代码块(如 {} 内部)有效,超出块级作用域后无法访问。
    • 代码块可以是 ifforwhile 等语句的 {},也可以是单独的 {}
  2. 避免变量提升

    • let 声明的变量不会像 var 那样被提升到作用域顶部,在声明之前访问会抛出 ReferenceError
  3. 防止重复声明

    • 在同一作用域内,let 不允许重复声明同名变量,否则会抛出 SyntaxError
  4. 更适合循环和闭包

    • 在循环中使用 let 可以避免 var 导致的闭包问题。

letvar 的区别

特性letvar
作用域块级作用域({} 内部有效)函数作用域(整个函数内部有效)
变量提升不会提升,存在“暂时性死区”会提升,声明前值为undefined
重复声明不允许重复声明允许重复声明
全局作用域行为不会成为全局对象的属性会成为全局对象的属性(如window
循环中的行为每次迭代都会创建一个新的绑定共享同一个绑定

示例对比

  1. 作用域
// 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 有块级作用域
  1. 变量提升
// var 的例子
console.log(a); // 输出 undefined,变量提升
var a = 5;

// let 的例子
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 10;
  1. 重复声明
// var 的例子
var c = 1;
var c = 2; // 不会报错

// let 的例子
let d = 1;
let d = 2; // 报错:SyntaxError: Identifier 'd' has already been declared
  1. 全局作用域行为
// var 的例子
var e = 100;
console.log(window.e); // 输出 100,var 声明的变量会成为全局对象的属性

// let 的例子
let f = 200;
console.log(window.f); // 输出 undefined,let 声明的变量不会成为全局对象的属性
  1. 循环中的行为
// 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 开发中,优先使用 letconst,避免使用 var
    • 如果需要声明常量,使用 const;如果需要修改变量,使用 let

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github