首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么要在匿名函数()调用中嵌入JavaScript类?

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

Stack Overflow用户
提问于 2012-10-02 22:27:27
回答 5查看 5.7K关注 0票数 17

我读到了微软的一种新的类似JavaScript的语言,叫做TypeScript。在playground (example section)中,TypeScript语法中有一个简单的类被转换为JavaScript代码。我有Java编程背景,了解从TypeScript编译而来的JavaScript是如何实现OOP的,这对我来说很有趣。

TypeScript代码:

代码语言:javascript
复制
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)

和等效的JavaScript代码:

代码语言: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);

Typescript部分非常类似于Java,所以我理解这一点。现在我的问题是,为什么在JavaScript中,Greeter类的主体被嵌入到匿名function()调用中?

为什么不这样写呢?

代码语言:javascript
复制
function Greeter(message) {
    this.greeting = message;
}
Greeter.prototype.greet = function () {
    return "Hello, " + this.greeting;
};

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

EN

回答 5

Stack Overflow用户

发布于 2012-10-02 22:36:14

这是为了允许私有成员。在这个例子中,所有的成员都是公共的,所以你的两个构造是等价的。但是,如果您希望提供私有成员,则需要通过闭包将它们隐藏在调用范围之外。因此,如果您有一个私有成员,如下所示:

代码语言:javascript
复制
class Greeter {
    private greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
} 

你可能会得到类似这样的东西:

代码语言:javascript
复制
var Greeter = (function () {
    var greeting="";
    function Greeter(message) {
        greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + greeting;
    };
    return Greeter;
})();

greeting变量将可用于在匿名函数中定义的任何函数,但在其他地方不可见。

票数 3
EN

Stack Overflow用户

发布于 2012-10-02 22:44:19

除了明显的作用域/闭包推理。使用立即调用自身的匿名函数预加载(解释)类定义。这使得任何JIT优化都可以在执行中进行前置加载。简而言之,对于更大、更复杂的应用程序,它将提高性能。

票数 3
EN

Stack Overflow用户

发布于 2012-10-02 22:31:02

匿名函数/自执行闭包通常用于封装作用域,以便只能在作用域外部访问返回值。(或附加到其他对象的任何内容,如窗口)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12692250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档