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

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

相关推荐
前端与小赵4 分钟前
uni-app隐藏返回按钮
前端·uni-app
钢铁男儿20 分钟前
Python内置类型子类化的陷阱与解决方案
开发语言·前端·python
野盒子30 分钟前
前端面试题 微信小程序兼容性问题与组件适配策略
前端·javascript·面试·微信小程序·小程序·cocoa
Hilaku38 分钟前
为什么我不再追流行,而是重新研究了 jQuery
前端·javascript·jquery
兔子1213539 分钟前
浏览器内容缓存数据量大时的优化方案
前端
G等你下课41 分钟前
JavaScript 中 Promise 的深度解析:异步编程的革新之路
前端·javascript
啃火龙果的兔子1 小时前
安全有效的 C 盘清理方法
前端·css
海天胜景1 小时前
vue3 数据过滤方法
前端·javascript·vue.js
天生我材必有用_吴用1 小时前
深入理解JavaScript设计模式之策略模式
前端
海上彼尚1 小时前
Vue3 PC端 UI组件库我更推荐Naive UI
前端·vue.js·ui