fn这里不懂

fn这里不懂

将count()赋值给fn,不就是把

{ var num=1;

return function(){……}

}

这一串赋值给fn了吗?为什么多次调用的时候,不会再重新执行  num=1 这句了呢?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
慕移动3569406 2020-01-14 19:22:05

第一次count()执行完后, 返回的就是count函数里面的匿名函数了, 所以fn被赋值为这个匿名函数, 即为fn = function(){....},  所以当执行fn的时候是不包括var num=1 这个语句。


其实这个就是后面会讲到的闭包的概念, 原本函数执行的基本原则是执行完后就立刻销毁执行环境(也就是count函数执行完了, num应该是跟着执行环境一起被销毁的, 是没有办法再访问的), 但是这里count函数在执行完毕之前返回了一个匿名函数, 这让我们想起了另外作用域链的感念, 也就是说函数作为一个局部作用域可以访问到上层作用域的变量(也就是说count返回的这个匿名函数可以访问到count函数里面的num变量)。 

所以返回出来的匿名函数依然持有对于count函数内部的访问权限, 所以count依然有利用价值, 所以不会被销毁。

回头来看就知道了, 为什么执行了三次fn() ,结果确是1,2,3了。

因为它们输出的是count函数执行完以后保留下来num变量的值。


个人水平有限,其实闭包还有更深层的解释, 可以参考老师的视频, 要想更明了、深入地了解闭包, 还是要看书籍补充, 多看不同书对于同一个概念的解释,就会越来越懂。

  • 第一次count()执行完后, 返回的就是count函数里面的匿名函数了, 所以fn被赋值为这个匿名函数, 即为fn = function(){....}, 所以当执行fn的时候是不包括var num=1 这个语句。 其实这个就是后面会讲到的闭包的概念, 原本函数执行的基本原则是执行完后就立刻销毁执行环境(也就是count函数执行完了, num应该是跟着执行环境一起被销毁的, 是没有办法再访问的), 但是这里count函数在执行完毕之前返回了一个匿名函数, 这让我们想起了作用域链的概念, 也就是说函数作为一个局部作用域可以访问到上层作用域的变量(也就是说count返回的这个匿名函数可以访问到count函数里面的num变量)。 所以返回出来的匿名函数依然持有对于count函数内部的访问权限, 所以count执行后创建的执行环境依然有利用价值, 所以不会被销毁,它里面的变量也就被保存下来,没有被清除。 回头来看就知道了, 为什么执行了三次fn() ,结果确是1,2,3了。 因为它们访问的都是当初count执行后没有被销毁的num变量。 个人水平有限,其实闭包还有更深层的解释, 可以参考老师的视频, 要想更明了、深入地了解闭包, 还是要看书籍补充, 多看不同书对于同一个概念的解释,就会越来越懂。可以先不要着急, 可以先简单的理解一下, 甚至死记都是可取的, 都是能够通过后续的课程的,主要先保证学习的积极性, 再来求完美。
    2020-01-14 19:27:35
好帮手慕星星 2020-01-11 09:46:18

同学你好,因为没有返回num值。count调用之后赋值给fn,那么fn的值就是return返回的函数。如果这个函数也没有用return返回的话,fn是没有值的。可以输出看看

http://img1.sycdn.imooc.com//climg/5e19289c09a1fb5103100258.jpg

http://img1.sycdn.imooc.com//climg/5e1928a509cecc5102060034.jpg

函数调用后如果函数外面想要拿到函数里面的内容,就需要return返回出来,否则是undefined。

自己再测试理解下,祝学习愉快!

好帮手慕星星 2020-01-03 10:54:17

同学你好,理解的有点问题,count()调用之后赋值给fn,是将return的函数给了fn,不包括定义num赋值为1这句话:

http://img1.sycdn.imooc.com//climg/5e0eac6709ce2b4705510424.jpg

所以在多次调用fn的时候,num值不会被初始化为1,结果是增加的。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 Elisa呀 #1
    抱歉,还是不太懂,、 var num=1不也是包含在函数count()之中吗?为什么赋值给fn的时候不包括这一句呢?
    2020-01-10 23:43:52
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师