JS求助T-T

qq65525599 2017-02-16 05:07:48
var a=9;
function fn(){
a=0;
return function(b){ return b+a++; }
}
var f=fn();
var m=f(5);alert(m);
var n=fn()(5);alert(n);
var x=f(5);alert(x);
alert(a);
弹出的四次结果是?
为什么?
fn()(5)是什么意思?
...全文
91 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojunjor 2017-02-16
  • 打赏
  • 举报
回复
首先fn里面的 a=0 没有用 var 声明,所以这个 a的作用域是全局,所以覆盖了函数fn外面的a=9,也就是说a就是0 然后fn函数是返回一个匿名函数(闭包),这个匿名函数调用了a,所以在fn执行完毕之后a不会被释放回收,而是会保留它的值。 上面两个明白了的话,就可以一步一步看了 var a=9; function fn(){ a=0; return function(b){ return b+a++; } } //返回匿名函数function(b){return b+a++;} a的值现在是0; var f=fn(); //调用上一句返回的匿名函数,也就是function(5){return 5+0++;} 返回5;所以这一句输出5,而且a自加变为1,注意f是闭包,所以f保留了a的值,而不会在执行结束后释放a,所以a是1被保留在f中,只单纯的保留在f中 var m=f(5);console.log(m); //fn()(5),就是上两句代码的简单写法,就是fn()先返回一个匿名函数,然后(5)再调用这个匿名函数,但是这句代码是新返回了一个匿名函数,不是再次调用f,所以这里面的a还是0,所以仍然返回5 var n=fn()(5);console.log(n); //再次调用f,f就是之前返回的匿名函数,而且f中的a已经自加一次并保存了,也就是1.所以这里是return 5+1++;返回了6,所以输出6,并且a再次自加1,变为2 var x=f(5);console.log(x); //a在上一句中自加为2了,所以输出2 console.log(a);
似梦飞花 2017-02-16
  • 打赏
  • 举报
回复
结果自己试 变量作用域的问题 f()() 返回函继续调用 科里化

87,990

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧