你们好,本人来在掘金待了有3个多月了,决定跟随前端大佬们的步伐,故决定记录本身的成长轨迹,因为水平有限,对于文章中出现的问题还请大佬们指正。javascript
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
}
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
复制代码
若是你的反应是: 前端
能够看到本题考查的知识点主要是闭包!java
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
复制代码
1.先来看第一句第一条调用语句:fun(0);
毋庸置疑确定是在调用最外层的fun
函数,调用时传了0
这个参数,由于最外层的fun
函数有两个形参,传的时候只传递了一个。那么也就是说这个n
对应的是0
,那么显然o
是没有值的,因此o
就是undefined
,因此第一次输出o
就是undefined
,但还须要注意一点,第一条执行完毕后,将他的执行结果赋值给了a
变量,由于全局的fun
函数里还return
了一个函数,因此咱们称这种函数为闭包函数!因此这里的a如今其实是这样一个玩意儿:bash
fun:function(m){
return fun(m,n);
}
复制代码
2.再来看第一句第二条调用语句:a.fun(1);
,注意啦,这里使用变量a
调用了fun
,也就是说这里调用的fun
其实是刚刚返回的闭包函数。 那能够很显然的看到,这个闭包函数接收一个参数。我们如今只传递了一个参数那就是1(因此形参 m = 1)
,重点又来了,你会发现里面又return
了一个函数,且里面多了一个参数n
,这里的n
实际上是闭包了上面的全局函数fun
中的n
,由于闭包会建立出一个不被销毁的做用域,因此n
还保留在内存中,那这里的n
的值也就是第一句第一条(fun(0)
)调用语句接收到的0 因此这里的m=1,n=0
,那刚刚也提到了里面又return
了一个全局函数fun(m,n)
,因此就是o=0 (o对应的就是全局函数形参中的n)闭包
3.再来看第一句第三条调用语句:a.fun(2)
时m
为2
,因此仍是闭包了第一次调用时的n,因此内部调用第一层的fun(2,0);因此o为0函数
4.再来看第一句第四条调用语句:a.fun(3)
时m
为3
,因此仍是闭包了第一次调用时的n,因此内部调用第一层的fun(3,0);因此o为0ui
所以能够看到第一个fun(0)是在调用第一层fun函数。 第二个fun(1)是在调用前一个fun的返回值的fun函数,因此: 后面几个fun(1),fun(2),fun(3),函数都是在调用第二层fun函数。
spa
即: 本题最终执行后的输出结果为undefined,0,0,0 code
能够看到这道题对闭包的考察彻头彻尾,从始至终都离不开闭包,经过这道题咱们得出结论:建立闭包能够保存一个或多个变量,供咱们循环利用。 但切记闭包极可能会致使内存占用过大。所以咱们应该理性的使用闭包给咱们带来的好处。cdn
好啦,到这里给你们留一个习题,接着上面的题目,咱们再追加一条调用语句,你们能够试着本身作一下,作完后能够参考下面的答案,看本身的结果是否正确
var b = fun(0).fun(1).fun(2).fun(3);
请输出上面这条语句的输出结果。
补充的题目的答案我会在评论区给出
大佬们若是发现了文中的错误,及时在评论区指出,我会及时修改!
若是以为对您有用请点个赞,谢谢大佬!