好久没写关于 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 | ✅ 是 | ❌ 否(常量) |
建议:以后写代码请尽量用 let
和 const
,别再用 var
啦~
🌍 全局作用域
let globalVar = '世界,你好!';
function sayHi() {
console.log(globalVar); // ✅ 可以访问
}
全局变量可以在整个作用域中访问,但也容易被污染,慎用!
🔗 作用域链:JS 查变量靠“祖宗牌位”
JavaScript 查变量时遵循“作用域链”原则:
查不到变量?找上级!再找不到?再上一级!最后全局都找不到?那就报错!
function outer() {
let a = 10;
function inner() {
console.log(a); // ✅ 找到 a
}
inner();
}
outer();
📌 注意:子作用域可以访问父作用域,但反过来不行!
作用域链是JS查找变量的机制,从当前作用域逐级向上查找,直到全局作用域。(其中父作用域无法访问子作用域,子可以访问父作用域)
🧹 JS 垃圾回收机制(GC)
垃圾回收三步曲:
- 内存分配:当对变量、函数、对象进行声明和调用时,自动分配内存
- 内存使用:即占用内存,使用变量和函数
- 内存释放:使用完毕,垃圾自动回收不再使用的内存
🔒 闭包:私密空间的创造者
✅ 闭包是什么?
闭包 = 函数 + 其定义时的外部变量
闭包作用: 封闭数据,提供操作,外部也可以访问函数内部的变量
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
接下来让我们来看下闭包的应用代码(实现数据的私有),学会闭包应用,迎娶白富美指日可待!
闭包确实存在一定的风险。例如,从 fun
函数中可以访问到 fn()
,而 fn()
中的 i++
又引用了 count()
作用域中的变量 i
,因此这个变量不会被垃圾回收机制释放。像这种由于闭包导致的变量无法被回收的情况,我们称之为 内存泄漏。
🐴 写在最后:牛马虽苦,JS 需补
“天苍苍,野茫茫,风吹草地见牛马。”
新时代的前端牛马,也要熟练掌握 JavaScript 的内功心法。理解作用域链、掌握闭包机制,才能在 AI 崛起的浪潮中站稳脚跟,从码农进化为“码王”。
如果你觉得这篇文章对你有帮助,欢迎:
你的一赞,是我码字的最大动力!🔥