【JS】var与let的区别

1. 作用域(Scope)

  • var:函数作用域(function-scoped)
  • let:块级作用域(block-scoped)
javascript 复制代码
// var 例子
function varExample() {
  if (true) {
    var x = 10; // 在整个函数内都可用
  }
  console.log(x); // 10 - 可以访问
}

// let 例子
function letExample() {
  if (true) {
    let y = 20; // 只在块内可用
  }
  console.log(y); // ReferenceError: y is not defined
}

2. 重复声明

  • var:允许重复声明
  • let:不允许重复声明
javascript 复制代码
var a = 1;
var a = 2; // ✅ 允许

let b = 1;
let b = 2; // ❌ SyntaxError: Identifier 'b' has already been declared

3. 变量提升(Hoisting)

  • var :会变量提升,但初始化为 undefined
  • let:也会提升,但存在"暂时性死区"
javascript 复制代码
console.log(c); // undefined
var c = 5;

console.log(d); // ReferenceError: Cannot access 'd' before initialization
let d = 5;

4. 全局对象属性

  • var 在全局作用域声明时,会成为全局对象的属性
  • let 在全局作用域声明时,不会成为全局对象的属性
javascript 复制代码
var globalVar = "hello";
let globalLet = "world";

console.log(window.globalVar); // "hello"(在浏览器中)
console.log(window.globalLet); // undefined

5. 循环中的表现差异

javascript 复制代码
// var 在循环中的问题
for (var i = 0; i < 3; i++) {
  setTimeout(() => {
    console.log(i); // 输出 3 3 3
  }, 100);
}

// let 解决这个问题
for (let j = 0; j < 3; j++) {
  setTimeout(() => {
    console.log(j); // 输出 0 1 2
  }, 100);
}

最佳实践建议

  1. 优先使用 let ,避免 var 带来的意外行为
  2. 只在需要变量提升特性时才使用 var(现在基本不需要)
  3. 使用 const 声明不应重新赋值的变量
  4. 保持代码的块级作用域清晰

现代JavaScript开发中,基本已经完全用 letconst 替代 var

相关推荐
神仙别闹2 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
伞伞悦读2 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
GreenTea3 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
mCell4 小时前
用 Knip 清理 AI Coding 留下的冗余代码
前端·ai编程·前端工程化
笃行3505 小时前
使用Rokid AIUI做了一个童年推箱子游戏
前端
2601_966949655 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
m0_734571765 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g
excel6 小时前
前端加密的作用与使用场景
前端
RAN11426760087 小时前
1.3第一个程序的介绍
开发语言·qt
计算机魔术师7 小时前
纽约时报版权诉讼披露:微软高管内部称训练 AI 是人类历史上最大规模劳动窃取
前端