这段jQuery代码是否有效?回调函数中变量a、b是否处于作用域内?
你的jQuery代码完全合法,变量作用域问题详解
核心结论
这段代码完全合法有效,当在fun2()中调用回调函数时,变量a和b始终处于作用域内——这就是你实际运行符合预期的原因。
背后的关键机制:闭包
这是JavaScript闭包特性的典型应用,具体逻辑如下:
- 当你在
fun1内部定义c1、c2这两个函数时,它们会自动"抓住"当前所在的fun1函数作用域(也就是包含参数a、b的作用域),并将这个作用域保留在自己的作用链中。 - 哪怕
fun1执行完毕退出,只要c1、c2还被外部代码引用(这里是被fun2接收,又绑定到了按钮的点击事件上),它们捕获的fun1作用域就不会被垃圾回收机制清理。 - 等到用户点击按钮触发回调时,
c1、c2执行,依然能访问到当初捕获的a和b变量。
执行流程拆解
- 调用
fun1(a, b)时,创建fun1的局部作用域,包含传入的参数a、b。 - 在
fun1内部定义c1、c2,这两个函数的作用链指向fun1的作用域。 - 将
c1、c2作为参数传给fun2,此时fun2的callback1、callback2变量引用了这两个函数。 fun1执行完毕,但因为c1、c2还被fun2中的按钮点击事件绑定引用,fun1的作用域不会被销毁。- 用户点击
#btnOk或#btnCancel,触发对应的点击回调,进而调用callback1()或callback2(),此时函数内部能正常访问fun1作用域里的a、b。
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

