为什么TypeScript在匿名函数中包装类?

时间:2015-06-25 13:24:48

标签: javascript typescript

例如,我们有一个Dog类:

class Dog {
    static food;
    private static static_var = 123;

    constructor(private name) {}

    speak() {
        console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
    }
}

编译为JS:

var Dog = (function () {
    function Dog(name) {
        this.name = name;
    }

    Dog.prototype.speak = function () {
        console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
    };

    Dog.static_var = 123;
    return Dog;
})();

这同样有效并且不那么复杂:

function Dog(name) {
    this.name = name;
}

Dog.prototype.speak = function () {
    console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
};

Dog.static_var = 123;

使用匿名函数包装器有什么(除“美学”之外)的原因吗?

1 个答案:

答案 0 :(得分:6)

两者之间的主要区别与hoisting有关。

TypeScript将类编译为函数表达式到变量的赋值。这意味着生成的构造函数仅在赋值时开始存在。在之前发生的代码中,Dog将绑定到undefined

另一方面,您的实现使用一个需要提升的普通函数 - 该范围内的任何代码,包括在函数之前发生的代码,都可以调用Dog构造函数。

我想TypeScript更喜欢确保在实际定义类之前不存在类,可能允许在同一范围内的多个点重新定义类。