闭包问题

伟go 2015-11-04 05:44:48
function repeat(func, times, wait) {
//不用匿名函数是为了方便调试
function repeatImpl() {
var handle, _arguments = arguments;
var i = 0;
handle = setInterval(function() {
i = i + 1;
//到达指定次数取消定时器
if (i === times) {
clearInterval(handle);
return;
}
func.apply(null, _arguments);
}, wait);
}

return repeatImpl;
}

var repeatFun = repeat(alert, 4, 3000);
repeatFun("hellworld");

为什么执行时变量i的值会自动更改
...全文
109 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
伟go 2015-11-05
  • 打赏
  • 举报
回复
引用 6 楼 zpjshiwo77 的回复:
i是这个匿名函数的一个自由变量啊,它是属于 repeatImpl这个函数的,并不是那个匿名函数。当那个匿名函数执行完一次,销毁的时候又不会销毁i变量,所以i的值会一直累加啊。
自己查了些资料,搞清楚了。正如你所说,当内部函数多次执行时,会引用同意个外部函数的活动对象。只有多次执行外部函数,才会多次创建外部函数的活动对象,正因为活动对象是同一个,所以说多次执行的结果可以累加。 详细解释可以参照《JavaScript高级程序设计》第三版 闭包一节。 谢谢以上朋友的回答。
zpjshiwo77 2015-11-05
  • 打赏
  • 举报
回复
i是这个匿名函数的一个自由变量啊,它是属于 repeatImpl这个函数的,并不是那个匿名函数。当那个匿名函数执行完一次,销毁的时候又不会销毁i变量,所以i的值会一直累加啊。
伟go 2015-11-05
  • 打赏
  • 举报
回复
引用 2 楼 slwsss 的回复:
???不是你让它更改的吗
这是我在别处找的代码,看不懂,不知道为什么每次执行setInterval中的内部函数时会累计更改i值,而不是每次从0开始计算,无限执行?
伟go 2015-11-05
  • 打赏
  • 举报
回复
引用 3 楼 u010313768 的回复:
其实执行repeatFun("hellworld");这局代码的时候,开始就定义了一个变量i,那么setInterval中的匿名函数执行了4次,每次都用的是同一个变量i,又不是复制一份过去的,那么有什么问题吗?
我的问题是,为什么重复执行setInterval中的匿名函数会将i的值累计增加,为什么不是每次都从0开始,无限执行下去?
small-dragon 2015-11-04
  • 打赏
  • 举报
回复
其实执行repeatFun("hellworld");这局代码的时候,开始就定义了一个变量i,那么setInterval中的匿名函数执行了4次,每次都用的是同一个变量i,又不是复制一份过去的,那么有什么问题吗?
slwsss 2015-11-04
  • 打赏
  • 举报
回复
???不是你让它更改的吗

87,964

社区成员

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

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