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

Phi*_*enn 10 javascript

我怎么能说:

var myFunction = function() {
   setTimeout(myFunction, 1000);
}
myFunction();
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ton 17

setTimeout功能需要一个函数引用*作为参数:引用变量,并且没有括号.

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

Nutshell: myFunction是对函数的引用.myFunction()执行函数,并在表达式中,将"等于"函数的返回值(或者undefined如果没有返回任何内容).

深入研究:有些情况setTimeout(myFunction(), 1000)可能有意义,比如它myFunction()本身是否会返回一个函数.例如:

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

所以:

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

最后:

setTimeout(myFunction(), 1000);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 奇怪的.JavaScript是一种古怪的语言. (2认同)
  • @cf_PhillipSenn:它在Python或C(函数指针)中基本相同.仅提供函数的名称引用它.在它后面添加括号称之为.当然,这在函数不是第一类对象的语言中不存在,因此不能直接引用(例如Java). (2认同)
  • 这并不奇怪:) 您也可以在 C#、VB.NET 中执行此类操作。这是一个非常有用的功能。 (2认同)

hug*_*omg 10

myFunction 是一个功能

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

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


Chr*_*ris 5

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