javascript - 全局作用域的函数表达式

标签 javascript function class typescript

发现 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/

相关文章:

Wordpress:将类选择器添加到the_tags();输出

java - 如何将方法从A类传递到B类

javascript - 用javascript计算订单上的数量和总数

javascript - 注入(inject) Javascript 函数的正确语法

javascript - 让我的 javascript 输出显示在我的 HTML 中

c++ - 范围解析运算符被使用两次

c++ - 指向类对象的新指针数组

javascript - 为什么我的脚本不会在每次页面加载时运行?

javascript - 获取当前时间,然后用javascript显示它

function - 使用 fminsearch 最大化函数