为什么要在匿名函数()调用中嵌入JavaScript类?

Ale*_*ack 17 javascript typescript

我正在阅读微软称为TypeScript的类似JavaScript的新语言.在playground(示例部分)中,TypeScript语法中有一个简单的类转换为JavaScript代码.来自Java编程背景,我很有兴趣了解如何在使用TypeScript编译的JavaScript中完成OOP.

TypeScript代码:

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}   

var greeter = new Greeter("world");

var button = document.createElement('button')
button.innerText = "Say Hello"
button.onclick = function() {
    alert(greeter.greet())
}

document.body.appendChild(button)
Run Code Online (Sandbox Code Playgroud)

和等效的JavaScript代码:

var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
})();
var greeter = new Greeter("world");
var button = document.createElement('button');
button.innerText = "Say Hello";
button.onclick = function () {
    alert(greeter.greet());
};
document.body.appendChild(button);
Run Code Online (Sandbox Code Playgroud)

Typescript部分与Java非常相似,所以我理解.现在我的问题是为什么在JavaScript中,Greeter类的主体嵌入在匿名function()调用中?

为什么不这样写呢?

function Greeter(message) {
    this.greeting = message;
}
Greeter.prototype.greet = function () {
    return "Hello, " + this.greeting;
};
Run Code Online (Sandbox Code Playgroud)

每种方法的优点/缺点是什么?

xan*_*ded 15

以下称为立即调用的函数表达式:

(function(){ ... })();
Run Code Online (Sandbox Code Playgroud)

它用于保持全局范围的清洁.但是,在这种情况下,由于返回值被赋值给变量,因此没有必要Greeter.此模式唯一有用的时间是您想要"私有" 静态成员.

例如:

var Greeter = (function () {
    var foo = 'foo', bar = 'bar'; /* only accessible from function's defined
                                     in the local scope ... */

    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
})();
Run Code Online (Sandbox Code Playgroud)