关于JavaScript闭包执行逻辑的疑问:调用结果为何不符?
为什么
count()和a()的执行表现不一样? 先拆解count()的执行逻辑
咱们一步步捋你的count代码:
function count() { var c = 0 ; return function() { c += 1 ; return c ; }; }
当你执行c1 = count()时:
- 确实调用了
count()函数,它内部做了两件事:- 声明并初始化变量
c = 0 - 返回一个完全没被执行的内部函数(就是那个写着
c +=1的函数)
- 声明并初始化变量
- 闭包确实记住了
c=0的环境,但重点是:内部函数里的c +=1根本没运行——你只是把这个函数本身赋值给了c1而已。
所以当你第一次调用c1()的时候,才会触发内部函数的执行:
- 把闭包里的
c从0加到1,然后返回1 - 第二次调用
c1(),c会变成2,返回2,以此类推。
再看a()的执行逻辑
你的a函数代码是:
function a() { alert('A!'); return function() { alert('B!'); }; }; var x = a();
当执行var x = a()时:
- 调用
a()函数,函数体里直接执行了alert('A!')——这行代码是在a()的主函数体里,不是返回的内部函数里。 - 执行完弹窗后,才返回那个包含
alert('B!')的内部函数,赋值给x。
这时候如果你调用x(),才会弹出'B!',其实和c1()的逻辑是对应的:返回的内部函数只有在被调用时才会执行。
核心区别总结
count()的主函数体里,只有变量声明和返回内部函数的操作,没有执行任何会修改c的代码;只有当你调用返回的内部函数(也就是c1())时,才会触发c的自增。a()的主函数体里,直接写了alert('A!')这个执行语句,所以调用a()的时候就会立刻执行它,而返回的内部函数要等你调用x()才会执行。
内容的提问来源于stack exchange,提问作者Claire
相关产品推荐
相关产品推荐

