这为什么要调用?

时间:2015-06-27 02:11:06

标签: javascript jquery setinterval

好奇为什么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);
        });

      }




任何信息都会很棒。

5 个答案:

答案 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引用函数本身,而不是它返回的值,因为你还没有要求它执行。你刚刚定义了它。