【问题标题】:When do I use parentheses and when do I not?什么时候使用括号,什么时候不用?
【发布时间】:2022-11-10 00:40:14
【问题描述】:

我怎么能说:

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

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    简而言之

    • myFunction 引用函数
    • myFunction()调用函数

    更多的话

    setTimeout 需要函数引用*作为论据。

    在某些情况下 setTimeout(myFunction(), 1000) 可能有意义,比如 myFunction() 返回一个函数,例如

    function myFunction() {
        return function() {
            alert("ohai")
        }
    }
    
    // Or
    
    const myFunction = () => () => alert("ohai")
    

    所以:

    setTimeout(myFunction(), 1000);
    
    • setTimeout获取myFunction的返回值
    • myFunction 返回一个函数(调用alert

    意味着每秒都会有一个警报。

    另见Why function statement requires a name?

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

    【讨论】:

    • 诡异的。 JavaScript 是一种古怪的语言。
    • @cf_PhillipSenn:在 Python 或 C(函数指针)中基本相同。仅提供函数名称即可引用它。在它后面加上括号就叫它。当然这在函数不是第一类对象因此不能被直接引用的语言中是不存在的(比如 Java)。
    • 这并不奇怪 :) 您也可以在 C# 和 VB.NET 中执行此类操作。这是一个非常有用的功能。
    【解决方案2】:

    myFunction 是一个函数

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

    setTimeout 的目的是在一段时间后运行代码。您只需要将函数传递给它(这样 setTimeout 本身就可以在适当的时候调用该函数),因为如果您在将函数传递给 setTimeout 之前调用了函数(带括号),它将执行现在而不是 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 秒后运行。

      【讨论】:

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