直到最近,我才知道立即执行的函数具有以下语法:
(function(){
…
})();
然后我在看一个图书馆,发现:
! function(){
…
}();
这两种方法是等效的吗?意思是,从执行的角度来看,它们是否具有相同的后果?
直到最近,我才知道立即执行的函数具有以下语法:
(function(){
…
})();
然后我在看一个图书馆,发现:
! function(){
…
}();
这两种方法是等效的吗?意思是,从执行的角度来看,它们是否具有相同的后果?
这篇博文对一般概念进行了非常彻底的讨论。
在开始这个问题时,“自我执行”一词是我所知道的,因为我在其他情况下看到过它,但在我的研究中,我发现“立即调用”这个词更准确,因为执行发生在函数体之外。我在问题中留下了“自我”以帮助他人。
如果您对为什么前面有操作员工作感到好奇,请查看“Javascript Self Executing应该工作吗?”的答案。其中详细说明了“解释 JavaScript 的封装匿名函数语法”的答案,该答案还包含有关封装函数以立即执行的有用信息。
从性能的角度来看,这篇博文“自调用函数”比较了!
, -
, +
, ~
, void
,delete
运算符和括号。差异似乎可以忽略不计,因此可读性可能是首选:正如作者所说it is still recommended to use the parentheses or a bang [!] because they are programming conventions
。
使用运算符前面的一个明显效果是每个运算符将影响返回类型的方式,但是如果您通过赋值捕获返回值(这似乎是立即调用的唯一方法),那么您可以省略运算符,如!
since赋值运算符允许解析器立即执行函数:var capture = function(){ return 'capture this' }();
另一个极端情况是您可以使用new
带括号的关键字,但不能在前面使用运算符时使用 - 请参阅此问题“(函数(){})()”和“(函数(){}())”在功能上相等在 JavaScript 中?其中有一个有趣的答案,揭示了执行括号的位置和使用new
如何改变封装的行为,这(如前所述)在使用运算符之前是不可能的。