🚀 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++;
}

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

相关推荐
福兮说5 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理5 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6666 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人6 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)6 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan7 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_7 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒8 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技8 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu9 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub