学习闭包时,老师举了一个这个例子,我有点懵

十八道胡同 2019-05-10 02:38:29

function setup(x){
var i=0;
return function (){
console.log(i);
return x[i++];
}
};
var next=setup(['a','b','c']);
next();


第一次调用next();输出a
第一次调用next();输出b
第一次调用next();输出c

第一次调用输出a可以理解,因为执行了var i=0;取的数组的第一个元素,但是第2次执行的时候,为啥没执行var i=0;
因为此时i是1,输出了b


谢谢回复。
...全文
241 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2019-05-10
  • 打赏
  • 举报
回复
如果你执行setup两次,会发现每个setup闭包里面的i和x都是独立的。 var next=setup(['a','b','c']); var next2=setup(['d','e','f']); next();返回 a next2();返回 d next2();返回 e next();返回 b next();返回 c next2();返回 f
天际的海浪 2019-05-10
  • 打赏
  • 举报
回复
引用 3 楼 LCL_data 的回复:
[quote=引用 2 楼 天际的海浪 的回复:] var i=0;是在setup函数中的。 而next是setup函数执行后返回的函数,也就是 function (){ console.log(i); return x[i++]; } next函数不包含 var i=0;
你的意思是 var next=function (){ console.log(i); return x[i++]; }; 因为next里面没有定义i,但是他用了setup里面的i,setup里面的i被next一直用着,无法释放,造成了i 就能享受和全局变量一样的特权,不会被回收还i++ ?? 这么理解?[/quote] 对。这才是闭包的真正作用。
十八道胡同 2019-05-10
  • 打赏
  • 举报
回复
引用 2 楼 天际的海浪 的回复:
var i=0;是在setup函数中的。 而next是setup函数执行后返回的函数,也就是 function (){ console.log(i); return x[i++]; } next函数不包含 var i=0;
你的意思是 var next=function (){ console.log(i); return x[i++]; }; 因为next里面没有定义i,但是他用了setup里面的i,setup里面的i被next一直用着,无法释放,造成了i 就能享受和全局变量一样的特权,不会被回收还i++ ?? 这么理解?
天际的海浪 2019-05-10
  • 打赏
  • 举报
回复
var i=0;是在setup函数中的。 而next是setup函数执行后返回的函数,也就是 function (){ console.log(i); return x[i++]; } next函数不包含 var i=0;
十八道胡同 2019-05-10
  • 打赏
  • 举报
回复
我找到了一个文章来解释这个 https://blog.csdn.net/coder_vader/article/details/78839686

87,904

社区成员

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

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