我有一个函数:
setInterval(function () { var counter = 0; (function() { counter = counter + 1; console.log(counter); })(counter) }, 1000)
为什么它不增加计数器?(相反,它记录1)。如何让它记录升序数字?(1、2、3、……)
a8jjtwal1#
1.你传递了一个参数给你的匿名函数,但是你没有把这个参数赋给一个变量。你忘了在函数定义中加入参数。1.每次迭代都创建新变量,而不是在它们之间共享变量。你需要把你的逻辑从里到外。
(function(closed_over_counter) { setInterval(function() { closed_over_counter++; console.log(closed_over_counter); }, 1000); })(0);
由于您使用的是IIFE而不是可以多次调用的函数,因此这是非常没有意义的。你也可以在闭包中声明变量。
(function() { var counter = 0; setInterval(function() { counter++; console.log(counter); }, 1000); })();
或者,由于Internet Explorer不再是大多数人关心的问题,因此可以放弃IIFE,而使用块。
{ let counter = 0; setInterval(function() { counter++; console.log(counter); }, 1000); }
yrwegjxp2#
你可以使用一个函数来返回一个函数作为闭包。
setInterval(function(counter) { return function() { console.log(++counter); }; }(0), 1000);
oknwwptz3#
带有箭头函数的Nina Scholz答案的模糊版本:
setInterval(((counter) => () => console.log(++counter))(0), 1000);
3条答案
按热度按时间a8jjtwal1#
1.你传递了一个参数给你的匿名函数,但是你没有把这个参数赋给一个变量。你忘了在函数定义中加入参数。
1.每次迭代都创建新变量,而不是在它们之间共享变量。你需要把你的逻辑从里到外。
由于您使用的是IIFE而不是可以多次调用的函数,因此这是非常没有意义的。你也可以在闭包中声明变量。
或者,由于Internet Explorer不再是大多数人关心的问题,因此可以放弃IIFE,而使用块。
yrwegjxp2#
你可以使用一个函数来返回一个函数作为闭包。
oknwwptz3#
带有箭头函数的Nina Scholz答案的模糊版本: