作用域与闭包:变量的"地盘"
什么是作用域?
作用域就是变量的"管辖范围"——一个变量在哪里能被看到、在哪里看不到。
就像你家的 WiFi 密码只有在家里能用。出了门,手机连不上。这个"家"就是 WiFi 密码的"作用域"。
全局 vs 局部
加载代码编辑器中……
规则很简单:
- 全局变量:在函数外面声明的,哪里都能用
- 局部变量:在函数里面声明的,出了函数就没了
Python 的 global 关键字
Python 有一个特殊情况:在函数内部修改全局变量需要用 global 关键字:
加载代码编辑器中……
Python 有点"保守"——你要明确说
global count才让你改全局变量。JS 比较"随意"——只要外面声明了,里面直接改。
块级作用域(JS 特有)
JS 的 let 和 const 有块级作用域——if、for 等大括号 {} 里的变量只在那个块里有效:
加载代码编辑器中……
这是一个很大的区别!
| Python | JavaScript (let/const) | |
|---|---|---|
| if 里的变量 | ✅ 外面能用 | ❌ 外面不能用 |
| for 里的变量 | ✅ 外面能用 | ❌ 外面不能用 |
| 函数里的变量 | ❌ 外面不能用 | ❌ 外面不能用 |
Python 只有函数作用域,JS 有块级作用域。Python 的变量"活得更久",JS 的变量"管得更严"。
闭包:函数记忆术
闭包(closure)是一个听起来吓人、但其实很直觉的概念:函数能"记住"它被创建时周围的变量。
加载代码编辑器中……
闭包就像一个背着书包的函数——书包里装着它出生时周围的变量。不管这个函数走到哪里,书包都跟着它。
注意 Python 需要 nonlocal 关键字来修改外层函数的变量(类似 global,但用于嵌套函数),JS 直接改就行。
问问 AI
问 AI:"闭包在实际编程中有哪些常见用途?能给我举 3 个实际的例子吗?"
闭包不只是面试题——它在事件处理、私有变量、函数工厂等场景中非常常见。
🏋️AI 练习
写一个 makeMultiplier(factor) 函数,返回一个新函数,这个新函数能把任何数字乘以 factor。
double = makeMultiplier(2)
triple = makeMultiplier(3)
double(5) → 10
triple(5) → 15
这就是闭包的经典应用——"函数工厂"。
小结
| 概念 | Python | JavaScript |
|---|---|---|
| 块级作用域 | ❌ 没有 | ✅ let/const 有 |
| 修改全局变量 | 需要 global | 直接改 |
| 修改外层变量 | 需要 nonlocal | 直接改 |
| 闭包 | ✅ 支持 | ✅ 支持 |
一句话:作用域决定变量的"地盘",闭包让函数能"记住"自己出生的地方。 掌握这两个概念,你就理解了大多数"变量怎么突然就找不到了"的 bug。