为什么会这样调用?

Why does this invoke?

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

      }

任何信息都会很棒。

它提供了一个句柄,以后可以用来清除计时器。

clearInterval(triggerA);

在第一种情况下,您正在调用函数 - 由带有参数的括号表示,即 (blinker, 2000) - 您正在分配此调用的 result (无论函数returns)到变量。

第二种情况,函数后面没有括号,所以没有被调用。您只是将函数本身分配给一个变量。

如果您在第二个案例中添加括号,它将调用并且您将看到警报,例如: var alerta = function(){alert('huh');}(); - 注意最后的 ()

顺便说一句,不要被函数定义中的括号混淆,即function()末尾的括号。这些只是表明您将要定义一个没有参数的函数,这不是实际的调用。 后是括号数的函数。例如你可以这样做: alert(function(foo){return foo * 3;}(100)); 并且它会提示“300”。第一个括号 (foo) 表示该函数有一个名为 foo 的参数。第二个括号 (100),在函数之后,实际调用带有参数(在本例中为 100)的函数。

下一行:

var triggerA = setInterval(blinker, 2000);

除了 setInterval.

之外实际上不调用任何函数

该函数接受两个参数:一个函数和一个数字,表示第一个参数调用之间间隔偏移的毫秒长度。

setInterval 函数将通过使用类似 arg1() 的方式调用函数来处理传入函数的调用。注意括号。

至于你的第二个问题,函数没有被调用,因为你所做的只是将变量 alerta 定义为对编写的匿名函数的引用。要调用函数,需要显式调用(调用函数的方法有很多种)。

不同的是,一个是函数的显式调用(在这种情况下,直接通过函数名调用函数),另一个是函数定义,但你只是将该变量设置为引用到函数。

这个:

var triggerA = setInterval(blinker, 2000);

实际上是调用(调用)函数setInterval。而且,如前所述,setInterval 确实 return 一个值。

在这里,您正在创建函数:

var alerta = function(){
    alert('huh');
};

function 是 Javascript 中的关键字,它告诉它您正在定义一个函数,而不是调用它。

setInterval 是一个函数的名称,因此它假定您正在调用该函数,因为它后面有括号 ()

希望对您有所帮助。

setInterval 和其他函数一样。 triggerA 是该函数返回的值。

相比之下,alerta 引用函数本身,而不是它的值 returns,因为您还没有要求它执行。您刚刚定义了它。