使用需要参数的非匿名函数的setInterval必须在匿名函数内。 为什么?
好的,我已经在jquery / javascript中查看了几个关于setInterval的post和其他地方关于答案的烦人的事情,我不知道为什么解决方案有效。
请考虑:
使用匿名函数,我们可以设置警报,重复输出“兔子”:
setInterval(function(){ alert("bunnies") },3000);
但是如果我们想要使用非匿名函数,我们必须编写代码
的setInterval(跳,3000);
function:
function hop(){ alert("bunnies"); }
如果我们尝试编码:
setInterval(hop(),3000);
跳转只执行一次。 我不明白为什么会这样。 我已经阅读了各种SO,这意味着我们需要传递对setInterval的引用。 这是否意味着第一个formssetInterval(hop,3000); 通过引用传递。 如果是这样可以解释?
因此我们有一个问题。 在那显然,希望能够将参数传递给函数跳像…..
setInterval(hop("bunnies"),3000);
function:
function hop(msg){ alert(msg); }
这确实会导致调用hop并输出“bunnies”,但同样只调用一次该函数。
因此,只要我能解决将参数传递给由setInterval控制的函数的唯一方法是将其合并到匿名函数中:
setInterval(function(){ hop("bunnies") },3000);
这传递了参数并重复执行跳跃,每隔3秒警告我们一次兔子(非常重要的是警告兔子)。
因此问题:
- 这是唯一允许您传入参数的语法。
- 为什么setInterval(hop(“bunnies”),3000); 不行。
setInterval
需要一个函数作为第一个参数。 当你尝试:
setInterval(function() {...}, 100);
要么
setInterval(funcName, 100);
你正确传递一个函数。
然而,当你尝试setInterval(funcName(), 100);
,您实际上正在调用该函数并将其返回值传递给setInterval
,这是不正确的。
1.这是唯一允许您传入参数的语法吗?
是的,这是我能想到的唯一直接的方式……
setInterval(function(){ hop("bunnies") },3000);
…但是如果你必须处理很多间隔,你当然可以写一个辅助函数,例如:
function Looper() { this.loops = {}; this.start = function(name, fn, interval, params) { this.loops[name] = setInterval(function() { fn.apply(null, params); // maybe bind the function? }, interval); }; this.stop = function(name) { clearInterval(this.loops[name]); }; }
(试试吧: http : //jsfiddle.net/ceHMs/ )
你会像这样使用它:
function say(name, msg){ console.log(name,':',msg) }; function shout(name, msg){ console.log(name,':',msg.toUpperCase()) }; var looper = new Looper(); looper.start('say', say, 1000, ['clock' 'tick']); looper.start('shout', shout, 2000, ['clock' 'tack']); // ... later ... looper.stop('shout');
但你必须评估这是否真的有必要。
2.为什么setInterval(hop("bunnies"),3000);
不行。
这是因为setInterval需要对一个Function的引用,该Function应该每隔几毫秒执行一次。
括号是这里的关键。 函数名后跟括号会执行给定的函数并返回函数的结果,因此您不会传递对setInterval的引用,而是传递函数hop(’bunnies’)的返回值。 函数的引用只是函数的名称 。 如果要调用引用的函数,只需在引用中附加括号即可。 琐碎的例子:
function executeFunction(fn){ fn(); };
知道了这一点,我们实际上可以修改你的跳跃函数,使其适用于setInterval(hop("bunnies"),3000);
:
function hop(msg){ return function(){ alert(msg) } }
但这几乎与在setInterval调用中直接使用匿名函数完全相同。 现在你只是在调用hop时返回那个匿名函数,这会使你的setIntervall调用更短。
最后,它归结为您的个人偏好和具体用例。 大多数情况下,直接在setInterval中使用匿名函数的方法是最明显的方法,也是其他人最容易理解的方法。
为什么
setInterval(hop("bunnies"),3000);
不行。
setInterval(hop("bunnies"),3000);
将立即调用hop
,然后将其返回值 ( undefined
)传递给setInterval
(它将被忽略,因为它不是函数或字符串)。
这是唯一允许您传入参数的语法。
不,但它是最好的支持。
另一种语法是
setInterval(hop, 3000, "bunnies")
你应该传递一个函数作为变量而不是调用它。
的setInterval(跳,3000);
因为第一个参数是一个按给定间隔调用的函数,所以通过像hop()一样调用函数,而不是传递函数。 如果要传递参数,请使用函数包装器
的setInterval(函数(){一跳(参数)},3000);