所以,最初的问题是下面的代码:
function () {
}();
引发异常。这是因为 JS 解析器无法自动判断是函数声明还是函数表达式。您描述的所有模式都用于明确告诉 JS“嘿,伙计,这是一个表达式”。但是在您的特定情况下,您没有这个问题,因为如果您前面有一个变量,JS 完全能够理解这是一个表达式,而不是一个声明,并且它不会引发任何语法错误。
在那种特定情况下,不需要任何“破解”,您可以简单地拥有:
var _global = function () {
}();
就是这样。现在的问题是:当您需要在没有任何变量的情况下立即调用函数时,使用哪种“hack”?您描述的所有模式都可以,Crockford 更喜欢这个:
(function(){
}());
这对我来说很有意义,至少因为你有一个完全隔离的块,与:
(function(){
})();
但是,如果您将代码与其他脚本结合在一起,或者您有以前的代码,如果它们最后不使用分号,您可能会遇到一些问题:
a = b + c
(function() {
}());
在这种情况下,JS 考虑c
一个函数的调用:
a = b + c(function() { }());
为了避免这种情况,开发人员通常会在前面添加一个分号,以确保安全:
;(function() {
}());
我个人更喜欢一些运算符,比如 bang (!):
!function () {
}();
这样,您就不会遇到使用括号的问题。更少的字符,给我一种“执行”的感觉。但是,就像其他方法一样,这是一种技巧,而且是个人品味的问题。例如,Crockford 不喜欢 A LOT 那种轰轰烈烈的东西。