我看到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在函数内部.
这个叫什么?
它是一种自动转载或自动执行的功能.您可能也想看到这个.
你应该什么时候使用这种技术?
如果要立即调用函数并仅将变量作用域保留在该函数表达式中.它不可用于外部世界,或者更确切地说是函数表达式之外的代码.
学到更多:
在您的示例中,您只有两个语句,它等同于:
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中自执行函数的目的是什么?