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

jon*_*jon 11 javascript

我看到Javascript代码在函数关闭大括号后立即使用括号,我无法理解它们用于什么.

例:

function foo(bar){
  return bar;
}(0);
Run Code Online (Sandbox Code Playgroud)
  • 怎么(0)办?

  • 这个叫什么?

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

Sar*_*raz 12

它们会立即调用与调用函数时类似的函数:

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

foo(); // call
Run Code Online (Sandbox Code Playgroud)

您也可以直接调用它:

(function foo(){
   alert('hello');
})(); // <--------------
Run Code Online (Sandbox Code Playgroud)

目前你有 Function Declaration.要实际自我调用它,你需要在括号中使用它(使它成为一个表达式):

(function foo(bar){
  return bar;
})(0);
Run Code Online (Sandbox Code Playgroud)

现在它Function Expression会立即调用.要了解Function Declaration和之间的区别Function Expression,请查看Kangax的这篇优秀文章:


(0)做什么?

它是传递给foo函数的参数,因此bar它将0在函数内部.

这个叫什么?

它是一种自动转载或自动执行的功能.您可能也想看到这个.

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

如果要立即调用函数并仅将变量作用域保留在该函数表达式中.它不可用于外部世界,或者更确切地说是函数表达式之外的代码.


学到更多:


Fel*_*ing 9

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

function foo(bar){
  return bar;
}
0;
Run Code Online (Sandbox Code Playgroud)

不是一个自我调用的功能.第一个语句是函数声明,第二个语句只是数字文字0,它不做任何事情.括号不执行该函数,它们是分组运算符.

我们怎么能证明这一点?尝试:

function foo(bar){
  return "bar";
}(0);
Run Code Online (Sandbox Code Playgroud)

并告诉我输出是什么.


如果我们有一个函数表达式,它将是一个自我调用的函数.为此,您可以使用分组运算符强制将其作为表达式进行求值.

例如:

(function foo(bar){
  return bar;
})(0);
Run Code Online (Sandbox Code Playgroud)

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

括号的位置也可以是:

(function foo(bar){
  return bar;
}(0));
Run Code Online (Sandbox Code Playgroud)

也许这就是你所看到的.

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