小白速通JavaScript变量的作用域

markdown 复制代码
# JavaScript作用域详解

## 什么是作用域?

作用域就是变量和函数的"可见范围"。简单说,它决定了代码中哪些部分可以访问某个变量。

## 两种主要作用域类型

### 1. 全局作用域

在函数外部声明的变量,整个程序都可以访问

```javascript
let globalVar = "我是全局变量";

function showGlobal() {
  console.log(globalVar); // 可以访问
}

showGlobal();
console.log(globalVar); // 也可以访问

2. 局部作用域(函数作用域)

在函数内部声明的变量,只有函数内部能访问

javascript 复制代码
function localScope() {
  let localVar = "我是局部变量";
  console.log(localVar); // 可以访问
}

localScope();
console.log(localVar); // 报错!外部无法访问

块级作用域(ES6新增)

letconst 声明的变量具有块级作用域({} 就是一个块)

javascript 复制代码
if (true) {
  let blockVar = "块内变量";
  console.log(blockVar); // 可以访问
}
console.log(blockVar); // 报错!超出作用域

作用域链(重要!)

JavaScript会从当前作用域开始,逐层向外查找变量

javascript 复制代码
let outer = "外部变量";

function outerFunc() {
  let middle = "中间变量";
  
  function innerFunc() {
    let inner = "内部变量";
    console.log(inner);  // 内部变量
    console.log(middle); // 中间变量 ← 来自父作用域
    console.log(outer);  // 外部变量 ← 来自祖父作用域
  }
  
  innerFunc();
}

outerFunc();

常见误区案例

案例1:变量提升的坑

javascript 复制代码
console.log(hoistedVar); // 输出undefined而不是报错
var hoistedVar = "我被提升了";

console.log(letVar); // 报错!
let letVar = "我不会被提升";

案例2:循环中的作用域

javascript 复制代码
// 使用var(有问题)
for (var i = 0; i < 3; i++) {
  setTimeout(() => {
    console.log(i); // 全部输出3!
  }, 100);
}

// 使用let(正确)
for (let j = 0; j < 3; j++) {
  setTimeout(() => {
    console.log(j); // 输出0,1,2
  }, 100);
}

总结表格

关键字 作用域类型 是否提升 是否可重复声明
var 函数作用域
let 块级作用域
const 块级作用域

记住:良好的习惯是尽量使用 letconst,避免使用 var

复制代码
相关推荐
Sheldon一蓑烟雨任平生4 分钟前
Sass 星空(Sass + keyframes 实现星空动画)
前端·css·vue3·sass·keyframes
⑩-11 分钟前
VUE3学习
前端·javascript·vue.js
Mr Xu_15 分钟前
Vue 3 中使用 mitt 实现组件间通信的实践与解析
前端·javascript·vue.js
呃m24 分钟前
更好地使用Google Chrome
前端·chrome
巧克力芋泥包24 分钟前
Vue3 详情页跨页循环(上一条,下一条)导航功能实现
前端·javascript·vue.js
摘星编程37 分钟前
React Native + OpenHarmony:BottomSheet联动效果实现
javascript·react native·react.js
前端之虎陈随易42 分钟前
前端通用插件开发工具unplugin v3.0.0发布
前端·typescript
Ashley_Amanda43 分钟前
SAP调用Web Service全流程详解
java·前端·数据库
Dreamy smile1 小时前
css :nth-child() 完全用法指南
前端·css