揭示模块模式中的额外括号

时间:2015-02-05 18:51:19

标签: javascript typescript

我正在查看由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();

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

1 个答案:

答案 0 :(得分:4)

只是要明确什么是函数表达式。

显然,这也有效:

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

然而,与以下方面存在细微差别:

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

除了不太清楚之外,没有包装括号的主要区别在于上下文定义了我们的函数是被解释为函数表达式还是函数声明。

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

如果他们的目标是吐出可读代码,那么这可能是他们选择使用包裹括号的原因。

另一方面,并​​非所有人都同意正确的IIFE表格。

E.g。克罗克福德的建议是:

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