闭包与普通函数的区别:为何MDN示例需嵌套内层函数?
闭包示例中内层函数的作用解析
你的写法和MDN的示例核心差异在于执行时机和可复用性,我们来拆解两者的区别:
1. 你的代码的问题
当你执行:
const size12 = makeSizer(12);
makeSizer函数会立刻执行,直接把页面字体设置为12px,同时因为函数没有返回值,size12最终是undefined——你没办法在之后的某个时刻(比如用户点击按钮时)再次触发“设置12px字体”这个操作。
2. MDN示例的设计意图
MDN的代码返回了一个内层函数,这时候:
const size12 = makeSizer(12);
makeSizer执行后,并没有立刻修改字体,而是返回了一个待执行的函数,size12就是这个函数的引用。之后你可以在任何需要的时候调用它,比如绑定到按钮点击:
document.querySelector('.btn-12').addEventListener('click', size12);
点击按钮时才会执行内层函数,把字体设置为12px。
3. 闭包的核心作用
这里的闭包让内层函数“记住”了外部函数makeSizer中的size参数——即使makeSizer已经执行完毕,内层函数依然能访问到对应的size值。所以size12、size14、size16这三个函数各自持有独立的size值,调用时会分别使用12、14、16来设置字体,不会互相干扰。
简单说,闭包在这里实现了延迟执行和状态保存,让你可以创建多个预设了不同字体大小的“操作函数”,在需要的时候再触发执行。
内容的提问来源于stack exchange,提问作者beta programmers
相关产品推荐
相关产品推荐

