闭包-小题目
来源:互联网 发布:海宁淘宝摄影 编辑:程序博客网 时间:2024/04/28 23:53
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); var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1); c.fun(2); c.fun(3);
理解:第一行a: fun(0) 调用第一层函数,传参进去为fun(0,o),console出来o,但是o未定义,所以值是undefined;首先:a.fun(1)则是在前面的基础上调用内部return下
的函数,即fun:,对应的把1传给m,再返回到第一层函数,即m=1,n=0.n=0是第一次调用时的值,本次为fun(1,0)。console出来值为0;然后a.fun(2),跟上面
是同理的,即传参后为fun(2,0),console出来第二个参数值仍然为0;a.fun(3)即为fun(3,0),console出来仍然值为0.
第二行b: fun(0) 使n=0,console是o的值,o是未定义,结果undefined;接下来在上一个基础上计算.fun(1),调用第二次函数,也就是返回下的函数,传参进去,
使得m=1,此时闭包了n=0,即fun(1,0),再返回第一层函数,console出来值为0;接下来在继续计算.fun(2),fun(2)则是调用第二次函数,也就是字面量,
传参进去m=2,此时闭包了上次的n=1,即fun(2,1),再调用第一层函数,console出来值为1;.fun(3)是同理的,即fun(3,2),console出来值为2;
第三行c:fun(0)依旧是undefined,.fun(1)依旧是0;(注意:c中存放的是fun(1)的返回值)c.fun(2)即在fun(1),执行第二层函数,即为fun(2,1),console
出来值为1;c.fun(3)仍然是在fun(1)基础上,执行第二层函数,即为fun(3,1),console出来结果仍然为1.
简单来说:第一行一直在执行a=fun(0)为基础的函数 即第二层函数 一直闭包第一次执行的 n=0 fun(1,0) fun(2,0) fun(3,0)
第二行一直执行上一步的值作为本次闭包,n的值依次增加传给下一位, fun(1,0)fun(2,1)fun(3,2)
第三行一直执行a.fun(0).fun(1),即fun(1)中n=1为闭包,下面一直延续使用它的闭包 fun(1,0)fun(2,1)fun(3,1)
阅读全文
0 0
- 闭包-小题目
- 闭包与柯里化的小题目
- 闭包题目
- 闭包题目
- js闭包相关题目
- js闭包 一些题目
- 闭包,小考题
- 小题目
- 小题目
- 小题目
- 小题目
- JS闭包以及具体题目1
- JS闭包以及具体题目2
- 离散题目17--求对称闭包
- 离散题目18--求传递闭包
- 离散题目17 对称闭包
- 离散题目18(传递闭包)
- Javascript闭包很好玩的题目
- 【干货】Nginx高并发配置 + Linux服务器优化配置
- 程序员的Epic Fail [0]
- Fragement切换
- list index out of range
- 每天一个linux命令(28):tar命令
- 闭包-小题目
- JS math.random随机数,产生指定范围内的随机整数的代码
- C++ 对象内存布局和多态实现原理
- “区块链“ 究竟是什么
- C#中ref和out地址传值结合QT中c++以及回调函数的一点理解
- rownum和rowid 的区别
- 每天一个linux命令(29):chgrp命令
- 数据渲染时js不被触发 解决方案
- java模拟http请求工具类