我何时使用括号,何时不使用括号?

时间:2011-11-01 15:53:35

标签: javascript

我怎么能说:

var myFunction = function() {
   setTimeout(myFunction, 1000);
}
myFunction();

为什么setTimeout中的函数调用不需要括号,但最后一行呢?

5 个答案:

答案 0 :(得分:17)

setTimeout函数需要函数引用 * 作为参数:引用是变量,没有括号。

函数调用需要括号(即使该函数不带参数)。

Nutshell: myFunction是对该函数的引用。 myFunction()执行函数,并在表达式中“等于”函数的返回值(如果没有返回任何内容,则为undefined。)

深入研究:在setTimeout(myFunction(), 1000)可能有意义的情况下,例如myFunction()本身返回函数。例如:

var myFunction = function() {
    return function() {
        alert("ohai");
    };
};
  • 匿名函数(包含单个return语句)立即执行。
  • 该函数的返回值本身就是一个包含alert
  • 的函数

所以:

  • myFunction是对函数的引用(恰好返回函数)。
  • myFunction()将执行。它评估为适用于setTimeout()的函数引用。

最后:

setTimeout(myFunction(), 1000);

这会在一秒钟内调用myFunction()的返回值。一秒钟之后,警报会弹出。

另见Why function statement requires a name?

*或者要评估的字符串,但首选参考。

答案 1 :(得分:7)

myFunction是一个函数

myFunction()调用函数并生成函数返回的任何值。

setTimeout的目的是在经过一段时间后运行代码。你只需要将函数传递给它(因此setTimeout本身可以在适当的时候调用函数),因为如果在将函数传递给setTimeout之前调用函数(带括号),它将执行 now 而不是之后1秒。

答案 2 :(得分:5)

使用括号时,它会说“立即调用此函数”。因此,如果你说setTimeout(myFunction(),1000);,它将使用函数的返回值作为超时的回调。如果函数的返回值本身不是函数,则会出现错误,因为它会尝试执行超时后不可执行的内容(字符串,数字,未定义等)。

答案 3 :(得分:2)

在第2行中,函数myFunction未被调用,但作为参数传递给setTimeout函数,而第4行调用myFunction;要调用函数,即使没有参数,总是必须使用括号。

答案 4 :(得分:1)

我认为,如果可以的话,这个示例将使其更清楚

function callback() {
  console.log('this function runs on page loads.');
}

setTimeout(callback(), 2000); 

此处callback()函数将在页面加载后立即运行,而不会等待2秒。

function callback() {
  console.log('this function runs after page loads.');
}

setTimeout(callback, 2000);

此处callback()功能将在2秒钟后运行。