花括号后面的括号是什么意思?

14
我看过一些JavaScript代码,在函数的右花括号之后紧跟着使用圆括号,但我不理解它们的用途。
示例:
function foo(bar){
  return bar;
}(0);
  • 什么是 (0) 的作用?

  • 这个叫什么?

  • 在什么情况下应该使用这种技术?


3
如果您只是提供了一个不好的例子,那么您的问题就是重复的 What do parentheses surrounding a JavaScript object/function/class declaration mean?。请注意,此链接为英文网站。 - Felix Kling
3个回答

12

他们立即调用函数,就像你调用函数一样:

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

foo(); // call

您也可以直接进行调用:

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

目前您有函数声明要实际进行自调用,您需要像这样在括号中书写它(以将其变成表达式):

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

现在它是函数表达式,并将立即调用。要了解函数声明函数表达式之间的区别,请查看Kangax的这篇优秀文章:


(0)是什么意思?

这是传递给foo函数的参数,所以函数内的bar将为0

这叫什么名字?

这是自执行函数或自调用函数。您可能还想参考此文章

何时应使用此技术?

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


了解更多:


提示:(function (...){ ... })(...); 每次都有效,即使是匿名函数,其返回值未分配给变量。 - K..
1
很不幸,这不是正确的。请看我的答案。但也许楼主只是举了个糟糕的例子。 - Felix Kling
@FelixKling:向您点赞。我忽略了原帖的语法,添加了更多细节。 - Sarfraz
我可以确认Felix和花括号后面的括号不会调用函数。 - Caco

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 中自执行函数的作用?


谢谢Felix,你一定有鹰眼 :) - jon

1

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

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

function foo(bar) {
    return bar;
}

foo(0); // returns 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接