好奇为什么setInterval通过变量赋值调用? 我认为setInterval有特殊的范围或类似的东西吗?
mobileBlink();
function mobileBlink(){
var blinker = function(){
jQuery('.navbar-toggle').fadeTo(1500, 0.4).fadeTo(1400, 1.0);
}
//Why does this invoke?
var triggerA = setInterval(blinker, 2000);
//Why does this not invoke?
var alerta = function(){
alert('huh');
};
jQuery('.navbar-toggle').click(function(){
clearInterval(triggerA);
});
}

任何信息都会很棒。
答案 0 :(得分:1)
在第一种情况下,您正在调用括号中带有参数的函数,即(blinker, 2000)
- 并且您正在分配此调用的结果(无论函数如何返回变量。
在第二种情况下,函数后面没有括号,因此不会调用它。您只需将函数本身分配给变量。
如果在第二种情况下添加括号,它将调用,您将看到警告,例如:
var alerta = function(){alert('huh');}();
- 请注意最后的()
。
顺便说一下,不要被函数定义中的括号混淆,即function()
末尾的括号。这些只是表明你要定义一个没有参数的函数,它不是一个实际的调用。它的括号在之后计算的函数。例如,你可以这样做:
alert(function(foo){return foo * 3;}(100));
它会提醒" 300"。第一个括号(foo)
表示该函数采用名为foo
的1个参数。在函数之后的第二个括号(100)
实际上使用参数调用函数(在这种情况下为100)。
答案 1 :(得分:0)
它提供了一个句柄,以后可用于清除计时器。
clearInterval(triggerA);
答案 2 :(得分:0)
以下一行:
var triggerA = setInterval(blinker, 2000);
实际上不会调用除setInterval
之外的任何函数。
该函数接受两个参数:一个函数和一个数字,表示第一个参数的调用之间的间隔偏移的毫秒长度。
setInterval
,该函数将通过调用类似arg1()
的函数来处理传入函数的调用。请注意括号。
至于你的第二个问题,函数没有被调用,因为你所做的只是将变量alerta
定义为对写入的匿名函数的引用。要调用该函数,需要进行显式调用(有很多方法可以调用函数)。
不同之处在于,一个是函数的显式调用(在这种情况下,通过名称直接调用函数),另一个是函数定义,但是您只是将该变量设置为对函数的引用。功能
答案 3 :(得分:0)
此:
var triggerA = setInterval(blinker, 2000);
实际上正在调用(调用)函数setInterval
。并且,如前所述,setInterval确实返回一个值。
在这里,您正在创建函数:
var alerta = function(){
alert('huh');
};
function
是Javascript中的一个关键字,它告诉您正在定义一个函数,而不是调用它。
setInterval
是函数的名称,因此它假定您正在调用该函数,因为它后面有parens ()
。
希望有所帮助。
答案 4 :(得分:0)
setInterval是一个像其他任何函数一样的函数。 triggerA
是该函数返回的值。
相反,alerta
引用函数本身,而不是它返回的值,因为你还没有要求它执行。你刚刚定义了它。