🚀 JavaScript作用域与闭包:菜鸟逆袭指南

🧠 第一章:作用域链快递员

  • 快递小哥送包裹(变量)的3种路径
    • 当前作用域(楼道快递柜)
    • 外部作用域(小区公告栏)
    • 全局作用域(城市快递中心)

📦 示例1.js演示:快递小哥的迷路之旅

javascript 复制代码
function bar() {
    console.log(myName); // 小哥在楼道没找到包裹
}

function foo() {
    var myName = "极客"; 
    console.log(myName); // 小哥在楼道顺利签收
}

var myName = "骑士"; // 全局快递中心存了"骑士"
foo(); // 小哥先查楼道再查公告栏

💥 漫画对话

快递员:"楼道快递柜空空如也!"

公告栏:"我这里有'骑士',但小哥你跑错地方啦!"


🎒 第二章:闭包背包工厂

  • 背包打包三部曲:
    1. 创建时:装进行李(变量声明)
    2. 运输中:保护行李(内存保留)
    3. 使用时:精准取物(自由变量访问)

🎭 示例3.js演示:背包客的奇幻漂流

javascript 复制代码
function foo() {
    var myName = "极客时间"
    let test1 = 1
    return { 
        getName: function(){ return myName } // 背包装入"极客时间"
    }
}
var bar = foo() 
console.log(bar.getName()) // 背包客掏出记忆中的行李

🎭 三幕剧

  1. 打包:小明把"极客时间"塞进帆布包
  2. 运输:背包穿越地铁站(函数执行结束)
  3. 取物:小明在咖啡馆掏出包里的"极客时间"

🔄 第三章:执行上下文剧院

  • 函数入场五幕剧:
    1. 票务系统(参数预处理)
    2. 检票口(变量提升)
    3. 剧场灯光(TDZ警戒)
    4. 演员登场(代码执行)
    5. 幕后整理(作用域回收)

🎭 示例2.js演示:剧院里的变量纠纷

javascript 复制代码
function bar() {
    var myName = "极客世界" // var演员提前入场
    let test1 = 100 // let演员迟到(TDZ警戒)
    if (1) {
        let myName = "Chrome浏览器" // 剧场新增临时座位
        console.log(test) // 💣TDZ雷区:test演员还没换衣服
    }
}

🚨 TDZ表情包
let test 是个害羞的演员,开灯前(代码执行前)不能偷看TA的戏服!

🧩 第四章:词法作用域谜题

  • 动态vs静态作用域:快递单编号之谜

    javascript 复制代码
    function outer() {
        var name = "A"
        return function inner() {
            console.log(name) // 为什么永远是"A"?
        }
    }
    var fn = outer() 
    var name = "B"
    fn() // 静态作用域:快递单写死"A",动态作用域会变成"B"!

🧩 对比表格:var/let/const的性格差异

特性 var(老顽固) let/const(新贵)
变量提升 ✅ 穿越时空 ❌ 严格检票
块级作用域 ❌ 混乱全场 ✅ 独立包厢
TDZ ❌ 无预警 ✅ 警戒线🚨

🧠 记忆口诀 & 互动测试

作用域三不原则

  1. 不问调用位置(只看代码结构)
  2. 不跨函数查找(函数是作用域墙)
  3. 不忘TDZ雷区(let/const有警戒期)

🧪 选择题

javascript 复制代码
function mystery() {
    console.log(a); // 输出?
    var a = 3;
    if (true) {
        let a = 4;
        console.log(a);
    }
}
mystery();

💡 答案弹窗
undefined(变量提升) → 4(块级作用域)

🧠 彩蛋:var a就像没穿衣服的演员,先入场后换装!


🎉 思考题 & 彩蛋

  1. 为什么闭包被称为"时间胶囊"?

    🧨 答案:它冻结了函数创建时的变量状态!

  2. 如何用TDZ解释"快递签收前不能拆箱"?

    🧨 答案:let/const的变量在声明前就像未签收的快递,禁止查看!

  3. 执行上下文的"检票口"和"剧场灯光"分别对应什么技术概念?

    🧨 答案:变量提升(var)和TDZ(let/const)!


🧠 技术总结

核心公式
作用域链 = 快递员路径
闭包 = 背包工厂 + 时间胶囊
执行上下文 = 剧院五幕剧

🎯 终极目标

让每个菜鸟都能笑着写出:

javascript 复制代码
function createCounter() {
    let count = 0;
    return () => count++;
}

😄 彩蛋:闭包就像恋爱关系------永远记得对方的变量!

相关推荐
DoraBigHead6 分钟前
React 中的代数效应:从概念到 Fiber 架构的落地
前端·javascript·react.js
LuckySusu6 分钟前
【vue篇】Vue 性能优化全景图:从编码到部署的优化策略
前端·vue.js
卓伊凡11 分钟前
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓
前端
笨笨鸟慢慢飞13 分钟前
Vue3后退不刷新,前进刷新
前端
LuckySusu15 分钟前
【vue篇】SSR 深度解析:服务端渲染的“利”与“弊”
前端·vue.js
LuckySusu15 分钟前
【vue篇】SPA 单页面应用:现代 Web 的革命与挑战
前端·vue.js
LuckySusu17 分钟前
【vue篇】Vue 初始化页面闪动(FOUC)问题终极解决方案
前端·vue.js
fruge18 分钟前
从 0 到 1 理解前端工程化:图表化解析核心逻辑
前端
LuckySusu19 分钟前
【vue篇】技术分析:Template 与 JSX 的本质区别与选型指南
前端·vue.js
BestStarLi24 分钟前
个人写码感悟:TailwindCSS不要忽视子选择器
前端