🌾 天苍苍野茫茫,风吹草地见牛马:JS作用域、闭包与GC机制全家桶

37 阅读3分钟

好久没写关于 JS 的文章了,是不是感觉代码越写越晕?其实很多问题归根结底,是基础没打牢。而在前端的学习旅程中,打好 JavaScript 的基本功,绝对是写好前端代码的重中之重。

现在传统前端已经逐渐被时代和 AI 大潮所席卷,人人都在冲击“全栈牛马”的位置。如果你还在犹豫什么是作用域、闭包怎么用、变量为什么突然失踪(其实是被 GC 了),那么这篇文章送你一份迟来的救命稻草。

好了废话不多说,快上马我们开冲!

🧭 作用域是什么?

作用域就是变量的“活动范围”,它决定了变量 能被谁看到,在哪能用,什么时候挂了(被 GC 了)

JavaScript 的作用域分为两类:

  • 全局作用域:放眼整个世界,谁都能看见你
  • 局部作用域:缩在小角落,只有附近的兄弟认识你

🏕️ 局部作用域

局部作用域分为函数和块作用域

1️⃣ 函数作用域

function getSum() {
  const num = 10;
}
console.log(num); // ❌ 报错:num 不是你能碰的

说明:函数内部声明的变量,外面是访问不到的。


2️⃣ 块级作用域(ES6 引入)

for (let t = 1; t < 10; t++) {
  console.log(t); // ✅ 正常输出
}
console.log(t); // ❌ 报错:t 不在你这片区了
声明方式支持块级作用域可重新赋值
var❌ 否✅ 是
let✅ 是✅ 是
const✅ 是❌ 否(常量)

建议:以后写代码请尽量用 letconst,别再用 var 啦~


🌍 全局作用域

let globalVar = '世界,你好!';

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

全局变量可以在整个作用域中访问,但也容易被污染,慎用!


🔗 作用域链:JS 查变量靠“祖宗牌位”

JavaScript 查变量时遵循“作用域链”原则:

查不到变量?找上级!再找不到?再上一级!最后全局都找不到?那就报错!

function outer() {
  let a = 10;
  function inner() {
    console.log(a); // ✅ 找到 a
  }
  inner();
}
outer();

📌 注意:子作用域可以访问父作用域,但反过来不行!

作用域链是JS查找变量的机制,从当前作用域逐级向上查找,直到全局作用域。(其中父作用域无法访问子作用域,子可以访问父作用域)

image.png

🧹 JS 垃圾回收机制(GC)

垃圾回收三步曲:

  1. 内存分配:当对变量、函数、对象进行声明和调用时,自动分配内存
  2. 内存使用:即占用内存,使用变量和函数
  3. 内存释放:使用完毕,垃圾自动回收不再使用的内存

image.png


🔒 闭包:私密空间的创造者

✅ 闭包是什么?

闭包 = 函数 + 其定义时的外部变量

闭包作用: 封闭数据,提供操作,外部也可以访问函数内部的变量

function outer() {
      let a = 10
      function fn() {
        console.log(a);
        fn()
      }
      return fn
    }
    // outer() === fn === function fn(){}
    // const fun = function fn() { }
    const fun = outer()
    fun() // 调用函数

    // 外面要使用这个 10

📦 应用:数据私有化封装

function count() {
  let i = 0;
  return function () {
    i++;
    console.log(i);
  };
}

const fn = count();
fn(); // 1
fn(); // 2

接下来让我们来看下闭包的应用代码(实现数据的私有),学会闭包应用,迎娶白富美指日可待!

image.png

闭包确实存在一定的风险。例如,从 fun 函数中可以访问到 fn(),而 fn() 中的 i++ 又引用了 count() 作用域中的变量 i,因此这个变量不会被垃圾回收机制释放。像这种由于闭包导致的变量无法被回收的情况,我们称之为 内存泄漏

🐴 写在最后:牛马虽苦,JS 需补

“天苍苍,野茫茫,风吹草地见牛马。”

新时代的前端牛马,也要熟练掌握 JavaScript 的内功心法。理解作用域链、掌握闭包机制,才能在 AI 崛起的浪潮中站稳脚跟,从码农进化为“码王”。


如果你觉得这篇文章对你有帮助,欢迎:

你的一赞,是我码字的最大动力!🔥