【问题标题】:When do I use parenthesis and when do I not?什么时候用括号,什么时候不用?
【发布时间】:2020-01-09 20:59:03
【问题描述】:

我怎么能说:

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

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    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?

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

    【讨论】:

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

    myFunction 是一个函数

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

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

    【讨论】:

      【解决方案3】:

      当您使用括号时,它表示“立即调用此函数”。所以如果你说setTimeout(myFunction(),1000);,它将使用函数的返回值作为超时回调。如果函数的返回值本身不是一个函数,你会得到一个错误,因为它会尝试在超时后执行一些不可执行的东西(字符串、数字、未定义等)。

      【讨论】:

      • 尽管如此,值得注意的是:如果返回的字符串是可执行的,比如alert("Hello world!");,它将在这种情况下工作,因为setTimeout 可以接受字符串作为 js 代码文字。跨度>
      【解决方案4】:

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

      【讨论】:

      • 我想一个 25 瓦的灯泡刚刚亮了。
      【解决方案5】:

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

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

      【讨论】:

      • 是的,我同意。第一个例子是错误的,不应该使用。
      猜你喜欢
      • 2022-11-10
      相关资源
      最近更新 更多