关于javascript:我什么时候使用括号,什么时候不使用?

When do I use parenthesis and when do I not?

我怎么能说:

1
2
3
4
var myFunction = function() {
   setTimeout(myFunction, 1000);
}
myFunction();

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


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

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

Nutshell:myFunction是对函数的引用。 myFunction()执行该函数,并且在表达式中,将"等于"函数的返回值(或者如果没有返回则返回undefined)。

深入挖掘:有些情况下setTimeout(myFunction(), 1000)可能有意义,就像myFunction()本身返回一个函数一样。例如:

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

所以:

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

最后:

1
setTimeout(myFunction(), 1000);

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

另请参见为什么函数语句需要名称?

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


myFunction是一个功能

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

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


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


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


我想这个例子会让我更清楚,如果我可以,

1
2
3
4
5
function callback() {
  console.log('this function runs on page loads.');
}

setTimeout(callback(), 2000);

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

1
2
3
4
5
function callback() {
  console.log('this function runs after page loads.');
}

setTimeout(callback, 2000);

这里callback()功能将在2秒后运行。