返回信息流虽然看了很多文章,但是一遇到题目貌似又不会了。。。感觉还是不理解。
下面这道题,不知道为什么输出是这样的,求大神指点:
然后这个是输出结果:
a.fun(1)这个是怎么调用的?好奇怪~
这是一条镜像帖。来源:北邮人论坛 / java-script / #4090同步于 2018/8/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖
【问题】闭包还是理解的稀里糊涂
leaveforever
2018/8/3镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
这道题只要找出返回的函数里的n是什么就行了
a=fun(0),所以n就是0,因此a.fun(x)都是0
同理fun(0).fun(1)会log(0),但他里面的n就变成了1,所以fun(0).fun(1).fun(2)会log(1),以此类推
第三个和第一个是一样的,c里面的n一直是1
闭包的核心是引用链,引用链其实就是函数中没有定义的变量都会一层一层的往上一级去找,一直到全局变量
第一组a=fun(0)定义了n=0,a是fun(0)返回的对象,对象a中所有的n都是引用的这个变量值0,第二组是多级调用,每一级返回对象中的n都是引用上一层调用时的n值,而最终返回的对象b中所有的n都是引用的最后一次调用时的变量值3,所以所有的b.fun(x)都会输出3,也就是第三组的例子了
稍微改写一下就好。
var a = fun(0); // 直接调用函数,打印undef。构造:a:n=0
var tmp1 = a.fun(1); // 打印:a:n=0。构造:tmp1:n=1,但被扔了。
var tmp2 = a.fun(2); // 打印:a:n=0。构造:tmp2:n=2,但被扔了。
var tmp3 = a.fun(3); // 打印:a:n=0。构造:tmp3:n=3,但被扔了。
var b0 = fun(0); // 直接调用函数,打印undef。构造:b0:n=0
var b1 = b0.fun(1); // 打印:b0:n=0;构造:b1:n=1
var b2 = b1.fun(2); // 打印:b1:n=1;构造:b2:n=2
var b = b2.fun(3); // 打印:b2:n=2;构造:b:n=3
var c0 = fun(0); // 直接调用函数,打印undef。构造:c0:n=0
var c = c0.fun(1); // 打印:c0:n=0;构造:c:n=1
var tmp2 = c.fun(2); // 打印:c:n=1;构造:tmp2:n=2,但被扔了。
var tmp3 = c.fun(3); // 打印:c:n=1;构造:tmp3:n=3,但被扔了。
【 在 leaveforever 的大作中提到: 】
: 虽然看了很多文章,但是一遇到题目貌似又不会了。。。感觉还是不理解。
: 下面这道题,不知道为什么输出是这样的,求大神指点:
: [upload=1][/upload]
: ...................
谢谢,好清晰,我理解啦~
【 在 specops 的大作中提到: 】
: 这道题只要找出返回的函数里的n是什么就行了
: a=fun(0),所以n就是0,因此a.fun(x)都是0
: 同理fun(0).fun(1)会log(0),但他里面的n就变成了1,所以fun(0).fun(1).fun(2)会log(1),以此类推
: ...................
谢谢暖神~~
【 在 nuanyangyang 的大作中提到: 】
: 稍微改写一下就好。
: [code=js]
: var a = fun(0); // 直接调用函数,打印undef。构造:a:n=0
: ...................
谢谢你~~
【 在 dahai 的大作中提到: 】
: 闭包的核心是引用链,引用链其实就是函数中没有定义的变量都会一层一层的往上一级去找,一直到全局变量
: 第一组a=fun(0)定义了n=0,a是fun(0)返回的对象,对象a中所有的n都是引用的这个变量值0,第二组是多级调用,每一级返回对象中的n都是引用上一层调用时的n值,而最终返回的对象b中所有的n都是引用的最后一次调用时的变量值3,所以所有的b.fun(x)都会输出3,也就是第三组的例子了