跳到主要内容

作用域与闭包:变量的"地盘"

什么是作用域?

作用域就是变量的"管辖范围"——一个变量在哪里能被看到、在哪里看不到。

就像你家的 WiFi 密码只有在家里能用。出了门,手机连不上。这个"家"就是 WiFi 密码的"作用域"。

全局 vs 局部

加载代码编辑器中……

规则很简单:

  • 全局变量:在函数外面声明的,哪里都能用
  • 局部变量:在函数里面声明的,出了函数就没了

Python 的 global 关键字

Python 有一个特殊情况:在函数内部修改全局变量需要用 global 关键字:

加载代码编辑器中……

Python 有点"保守"——你要明确说 global count 才让你改全局变量。JS 比较"随意"——只要外面声明了,里面直接改。

块级作用域(JS 特有)

JS 的 letconst块级作用域——iffor 等大括号 {} 里的变量只在那个块里有效:

加载代码编辑器中……

这是一个很大的区别

PythonJavaScript (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

这就是闭包的经典应用——"函数工厂"。

小结

概念PythonJavaScript
块级作用域❌ 没有✅ let/const 有
修改全局变量需要 global直接改
修改外层变量需要 nonlocal直接改
闭包✅ 支持✅ 支持

一句话:作用域决定变量的"地盘",闭包让函数能"记住"自己出生的地方。 掌握这两个概念,你就理解了大多数"变量怎么突然就找不到了"的 bug。