在这个案例中,f2是闭包吗?nadd是闭包吗?

在这个案例中,f2是闭包吗?nadd是闭包吗?

function f1(){

var n = 999;

nAdd = function(){

n = n+1;

}

function f2(){

alert(n);

}

return f2;

}

var rs =f1();

rs();// 999

nAdd(); // --->执行了

rs();// 1000

在这里输入代码,可通过选择【代码语言】突出显示


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

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

3回答
好帮手慕久久 2020-12-19 18:55:32

同学你好,问题解答如下:

1、在同学的例子中nAdd和f2一样,都能形成闭包,只是二者保存下来的作用域是同一个。可以将函数改成如下形式:

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

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

在上图的例子中,调用两次nAdd,结果分别是1000、1001,就证明了第一次调用nAdd时,f1的作用域是没有被销毁的,否则第二次调用nAdd,不会得到1001。第一次调用nAdd后,f1内的n变成了1000,由于f1没有被销毁,所以第二次调用nAdd时,会继续操作f1中的变量n,将其由1000变成1001。

2、闭包的本质是:函数里的子函数被函数外部一直使用,使子函数无法释放,保持其所在作用域(重点),形成一个封闭的作用域。nAdd是函数f1内的子函数(理解成变量也行),由于它在全局作用域中的被使用(全局作用域内的变量不会被销毁),所以nAdd不会被销毁,从而让f1形成的作用域也不会销毁,这样就符合了闭包的本质,因此是一个闭包。

关于闭包,同学目前只需要重点理解f2那种固定的形式即可,对于特殊的闭包,可以在有了实际经验之后,再回头理解,有了经验后,理解会更容易些,不要着急。

祝学习愉快!

好帮手慕久久 2020-12-19 13:35:28

同学你好,问题解答如下:

就因为nAdd是全局的,它可能随时会被使用,所以不会被销毁(一旦销毁就没法使用它了),而它需要访问f1内的变量n,因此f1形成的作用域也不能被销毁,这样f1的作用域就会保存下来,就形成了闭包。

祝学习愉快!

  • 提问者 慕前端2185815 #1

    f1形成的作用域未被销毁,是因为f2的原因,nAdd未产生什么作用呀,只是他需要n的值进行运算。

    闭包到底是该如何理解呢?

    2020-12-19 18:32:37
好帮手慕久久 2020-12-19 10:59:15

同学你好,二者都是闭包。f2是一个很常见的闭包形式,即f1嵌套f2并把f2导出;全局变量rs,实际上就是f2;由于f2在全局中被使用,导致f2无法被释放,从而保持其所在的作用域(f1形成的作用域)不被销毁,从而形成了闭包。而nAdd也是f1内定义的函数,在全局中访问它时,也会导致它无法被释放,也会把保持它所在的作用域(f1形成的作用域)不被销毁,也行成了闭包。

祝学习愉快!

  • 提问者 慕前端2185815 #1

    nAdd不是一个全局变量吗?任何时候都可以被访问到,为什么它还是一个闭包呢?

    2020-12-19 11:06:36
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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