13

我已经看到 Javascript 代码在函数的右花括号后立即使用括号,我不明白它们的用途。

例子:

function foo(bar){
  return bar;
}(0);
  • 做什么(0)

  • 这个叫什么?

  • 什么时候应该使用这种技术?

4

3 回答 3

12

它们立即调用函数,类似于调用函数时:

function foo() {
   alert('hello');
}

foo(); // call

您也可以直接调用它:

(function foo(){
   alert('hello');
})(); // <--------------

目前你有 Function Declaration. 要真正自我调用它,您需要在括号中使用它(使其成为表达式):

(function foo(bar){
  return bar;
})(0);

现在它是Function Expression并且将立即调用。要了解 和 之间的区别Function DeclarationFunction Expression请查看Kangax的这篇优秀文章:


(0) 做什么?

它是传递给foo函数的参数,因此bar0在函数内部。

这个叫什么?

它是一个自我更新或自我执行的功能。您可能还想看看这个

什么时候应该使用这种技术?

当您想立即调用函数并将变量范围仅保留在该函数表达式内时。外部世界或该函数表达式之外的代码将无法使用它。


学到更多:

于 2012-06-21T10:31:35.060 回答
10

在您的示例中,您只有两个语句,它相当于:

function foo(bar){
  return bar;
}
0;

不是自调用函数。第一条语句是函数声明,第二条语句只是数字文字0,它不做任何事情。括号不执行函数,它们是分组运算符

我们如何证明这一点?尝试:

function foo(bar){
  return "bar";
}(0);

并告诉我输出是什么。


如果我们有一个函数表达式,它将是一个自调用函数。为此,您可以使用分组运算符强制将其评估为表达式。

例如:

(function foo(bar){
  return bar;
})(0);

这是一个命名函数表达式。表达式 ( (function ....)) 的结果是函数引用,并(0)执行函数,0作为参数传递。

括号的位置也可以是:

(function foo(bar){
  return bar;
}(0));

也许这就是你所看到的。

这种技术已经在这里广泛讨论过:JavaScript 中自执行函数的目的是什么?

于 2012-06-21T10:43:59.187 回答
1

这是一个自调用函数。您将 0 作为参数传递。因此,您的函数将返回等于 0 的 bar。

例如,下面的函数是等价的:

function foo(bar) {
    return bar;
}

foo(0); // returns 0
于 2012-06-21T10:35:47.550 回答