我有以下代码:
var foo=5;
var los= function (){
alert(foo);};
setInterval(los, 1000);
正常工作。
如果我将其更改为:
var los= function (){
alert(foo);};
setInterval(los(), 1000);
它只执行一次,在控制台中没有错误。
有人可以解释为什么当我在los
函数中包含setInterval
之后的parentesis时会发生这种情况吗?
答案 0 :(得分:6)
因为您正在执行los()
,然后该(单个)执行的结果将传递到setInterval
函数。
setInterval
需要传入的函数,而不是undefined
,这是los
返回的内容。但是,它没有抱怨 - 它只是没有做任何事情。
答案 1 :(得分:3)
请记住,在JavaScript中,函数是一个对象,像任何其他变量一样传递。所以这是对函数的引用:
los
另一方面,执行函数并计算结果:
los()
所以当你这样做时:
setInterval(los(), 1000)
您没有为函数设置间隔,而是设置函数的结果。因此,例如,如果函数返回true
,那么您基本上就是这样写的:
setInterval(true, 1000)
执行一次该函数,然后重复其结果的间隔。你想要的是在区间中使用函数引用本身:
setInterval(los, 1000)
那样setInterval
将每个间隔执行该函数,而不是执行其结果(不执行任何操作)。
答案 2 :(得分:1)
你在第二个中获得的()
意味着调用函数,然后将结果传递给setInterval
。括号是明确请求调用函数的运算符;毕竟,这就是为什么你把括号放在setInterval
的参数周围。
函数的名称本身就是JavaScript中的有效表达式。这种表达式的值是对函数的引用。这是你在设置间隔计时器时想要的值 - 你想告诉系统在计时器到期时要调用什么函数,所以你传递一个对它的引用。