闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。

执行以下程序,输出结果为()

function outer(){ var num = 0; function inner(){ num++; console.log(num); } return inner; } var f1 = outer(); f1(); f1(); var f2 = outer(); f2(); f2();

A
1 2 3 4

B
1 1 1 1

C
1 2 1 2

D
1 1 2 2

正确答案:C

闭包变量为num,内部函数inner可以访问到外部函数outer的num变量,这相当于授权该变量可以被延迟使用,
每次调用外部函数时,都会开辟相应的内存空间,闭包变量num会保存在该内存空间中,直到该外部函数的内存空间被销毁。
在本题中,调用外部函数outer时开辟一个内存空间,变量num保存在该内存空间中,因此两次调用f1的输出结果为1 2;
当再次调用外部函数outer时,又重新创建一个内存空间,因此两次调用f2的输出结果同样为1 2。

闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。

闭包函数作用:1.延长参数的生命周期 2.变量私有化。

局部变量会常驻在内存中。

var f1 = outer();
f1();
f1(); // 变量常驻内存

每次外部函数执行的时 候,外部函数的引用地址不同,都会重新创建一个新的地址。

var f1 = outer();
var f2 = outer(); // 外部函数每次调用,都会开辟新的内存空间。

这其实是一道考察闭包和作用域链的问题。

f1、f2赋值执行了两次outer函数,所以创建了两个执行上下文,返回了两个闭包,都知道闭包会保留住父上下文的活动对象(es5以后是词法环境)不被销毁,所以这两个闭包保留的是两个父执行上下文的活动对象,而不是一个,所以f1的i会在f1执行多次的情况下累加,而f2的i会在f2执行多次的情况下累加,他们相互不冲突。


__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/17833528.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示