Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么setInterval回调只执行一次?_Javascript_Callback_Setinterval - Fatal编程技术网

Javascript 为什么setInterval回调只执行一次?

Javascript 为什么setInterval回调只执行一次?,javascript,callback,setinterval,Javascript,Callback,Setinterval,我有我做的这个计数器,但我希望它永远运行,它真的很简单,我做错了什么 function timer() { console.log("timer!") } window.setInterval(timer(), 1000) 您使用函数调用而不是函数引用作为setInterval的第一个参数。这样做: function timer() { console.log("timer!"); } window.setInterval(timer, 1000); 或更短(但当函数变大时,可读

我有我做的这个计数器,但我希望它永远运行,它真的很简单,我做错了什么

function timer() {
  console.log("timer!")
}

window.setInterval(timer(), 1000)

您使用函数调用而不是函数引用作为setInterval的第一个参数。这样做:

function timer() {
  console.log("timer!");
}

window.setInterval(timer, 1000);
或更短(但当函数变大时,可读性也会降低):


setInterval
setTimeout
必须与回调一起使用,如:

setInterval(timer, 1000);
或未命名的函数:

setInterval( function() { console.log("timer!"); }, 1000 );
为什么代码不起作用-当您将一个函数作为参数传递给另一个带括号的函数时,例如
doSomething(someFunc())
您正在传递函数的结果

当函数作为对象传递时,例如
doSomething(someFunc)
传递回调。通过这种方式,
someFunc
作为引用传递,并在调用函数的某处执行。这与其他语言中指向函数的指针相同


一个常见的错误是使用这两个函数,如中所示。这会隐式调用
eval

答案正确地指出回调函数的参数中不应包含“()”。根据,较短的版本可能会导致内存泄漏。@crending两个版本都有完全相同的“问题”(也就是说,对于扩展,不影响正常的网页/JS)因为重要的是对象生命周期。这就是为什么我说“可能”,因为OP没有指定他的用例。如果它是从Mozilla扩展中提取的,请注意。您不能使用setInterval,但可以使用setTimeout函数来模拟。问题是
timer()
调用计算
timer
所产生的函数对象,然后将结果(
未定义的
)传递到
setTimeout
。所以,不要调用它。相反,只需传递函数对象:
setInterval(timer,1000)
setInterval( function() { console.log("timer!"); }, 1000 );