什么时候用括号,什么时候不用?

IT技术 javascript
2021-01-16 11:24:08

我怎么可以说:

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

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

5个回答

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()在一秒钟内调用的返回值。一秒钟后,向上弹出警报。

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

* 或要评估的字符串,但首选引用。

奇怪的。JavaScript 是一种古怪的语言。
2021-03-22 11:24:08
@cf_PhillipSenn:在 Python 或 C(函数指针)中基本相同。仅提供函数名称引用它。在它后面添加括号调用它。当然,这在函数不是一等对象的语言中不存在,因此不能直接引用(例如 Java)。
2021-03-22 11:24:08
这并不奇怪:) 你也可以在 C#、VB.NET 中做那种事情。这是一个非常有用的功能。
2021-03-27 11:24:08

myFunction 是一个函数

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

setTimeout 的目的是在经过一段时间后运行代码。你需要的功能只是传递给它(这样的setTimeout可以自称在适当的时候函数),因为如果你将它传递给setTimeout的前调用的函数(用括号),将执行现在而不是1秒后,。

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

尽管如此,值得注意的是:如果返回的字符串是可执行的,比如说alert("Hello world!");它可以在这种情况下工作,因为setTimeout可以接受字符串作为 js 代码文字。
2021-04-06 11:24:08

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

我想一个 25 瓦的灯泡刚刚亮了。
2021-03-30 11:24:08

如果可以的话,我认为这个例子会更清楚,

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 秒后运行。

是的我同意。第一个例子是错误的,永远不应该使用。
2021-04-04 11:24:08