显示模块模式时的额外括号

Extra parenthesis in revealing module pattern

我正在查看 TypeScript 编译器生成的一些代码,我注意到它在额外的括号中包装了来自揭示对象模式的函数。我认为这是有原因的,原因是什么?

var Castle = (function () {
 function Castle(name) {
     this.name = name;
 }
 Castle.prototype.Build = function () {
     var element = document.getElementById("textArea");
     console.log("Built " + this.name);
 };
 return Castle;
})();
var test = new Castle("Winterfell");
test.Build();

注意外部函数在 () 中。没有它们,代码似乎也能正常工作。

只是为了弄清楚函数表达式是由什么组成的。

显然,这也有效:

var test = function () { return 'test'; }();

但是,与以下内容略有不同:

var test = (function () { return 'test'; })();

与不带圆括号的主要区别在于上下文定义了我们的函数是被解释为函数表达式还是函数声明。

例如,如果您要从第一个示例中删除 var test =,则会导致语法错误,因为无法调用函数声明。

如果他们的目标是生成可读代码,那么这可能就是他们选择使用圆括号的原因。

另一方面,并​​不是每个人都同意 IIFE 的正确形式。

例如康乐福建议:

var test = (function () { return 'test'; }());