发现 TypeScript 后,我尝试了在线编译器,生成的 JavaScript 代码让我对函数表达式产生了好奇。
一个简单的 TypeScript 类:
class Person {
firstName: String = "John";
lastName: String = "Doe";
}
生成以下 JavaScript 代码:
var Person = (function () {
function Person() {
this.firstName = "John";
this.lastName = "Doe";
}
return Person;
})();
这让我想知道为什么他们选择使用自动执行函数,而更简单的东西可能就足够了。名称与变量相同的内部函数的目的是什么?
为什么他们不选择更简单的东西,例如:
var Person = function() {
this.firstName = "John";
this.lastName = "Doe";
};
或者甚至:
function Person() {
this.firstName = "John";
this.lastName = "Doe";
}
据我所知,在全局范围内使用函数表达式没有任何优点,只有在声明函数之前无法调用该函数的缺点。
最佳答案
它有助于继承。它允许他们捕获基类并重命名为_super
,这有助于代码生成,例如:
class Foo{
}
class Bar extends Foo{
}
变成:
var __extends = this.__extends || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var Foo = (function () {
function Foo() {
}
return Foo;
})();
var Bar = (function (_super) {
__extends(Bar, _super);
function Bar() {
_super.apply(this, arguments);
}
return Bar;
})(Foo); // Notice base class is captured here
这在 JS 中也是一个很好的实践。例如,如果您在此示例中继续使用 Foo
而不是 _super
,并且您要更改基类,那么您将遇到一系列令人头疼的问题,而这些问题是可以避免的。
关于javascript - 全局作用域的函数表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19992871/