【问题标题】:Why is this javascript function inside parenthesis?为什么这个javascript函数在括号内?
【发布时间】:2016-03-04 12:01:06
【问题描述】:

我正在寻找一个问题的解决方案,我发现了这个 aswer https://stackoverflow.com/a/6962808/2724978

写的函数是:

(function loop() {
    var rand = Math.round(Math.random() * (3000 - 500)) + 500;
    setTimeout(function() {
            doSomething();
            loop();  
    }, rand);
}());

我的问题是,为什么函数内括号中的末尾也有 ()?这让我有点困惑,以前从未见过。

【问题讨论】:

  • 因为函数没有被评估。
  • 末尾的2括号是调用循环函数。括号中的块是一种特殊符号,用于将内部的所有内容设为私有(无法从外部访问)。
  • 如果你输入function loop() { ... };,那么定义函数。它还没有执行。调用函数是由()(这是参数列表)完成的,它实际上执行了函数。你在() 前面加上一个名字,你会得到loop(),它告诉JS 引擎执行这个函数。
  • @Walfrat:parens 没有做任何事情来使里面的东西或多或少变得私密。
  • JavaScript IIFE的可能重复

标签: javascript scope


【解决方案1】:

这是Immediately Invoked Function Expression 的示例。

上面的链接将解释您需要知道的所有内容,但基本上发生了两件事。

  • 用括号括起来告诉解析器将其中的所有内容都视为表达式。
  • 之后立即调用表达式(使用())可确保该表达式的范围是封闭的。

【讨论】:

    【解决方案2】:

    sn-p 创建一个匿名函数,并立即调用它。

    没有括号的问题,

    // This is a syntax error
    function () {
      something;
    }();
    

    那是语法错误吗?因为语句以 'function' 开头,所以解析器期望后面跟着一个函数名。将它全部包裹在括号中使得在那里定义匿名函数在语法上是合法的。

    // This is valid syntax
    (function () {
      something;
    }());
    

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2011-05-01
      • 2011-08-14
      • 2013-10-05
      • 1970-01-01
      相关资源
      最近更新 更多