Proč vložit třídu JavaScript do anonymní funkce () volání?

hlasů
17

Četl jsem o novém JavaScript-jako jazyk od společnosti Microsoft s názvem strojopisem . Na hřišti (příklad sekce) , existuje jednoduchý třídy v syntaxi strojopisu převedeny na kód JavaScriptu. Přicházející z programovacího jazyka Java pozadí, to bylo zajímavé pro mě naučit, jak se OOP provádí v jazyce JavaScript jako sestaven z strojopisem.

Strojopisu kód:

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)

A ekvivalent JavaScript kód:

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);

Strojopisu část je velmi podobný Javě, takže chápu, že. A teď moje otázka je, proč v JavaScriptu tělo Greetertřídy je zakotven v anonymním function()hovoru?

Proč ne psát to takhle?

function Greeter(message) {
    this.greeting = message;
}
Greeter.prototype.greet = function () {
    return Hello,  + this.greeting;
};

Jaká je výhoda / nevýhoda každé metody?

Položena 02/10/2012 v 15:27
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
14

Následující se nazývá Ihned vyvolání funkce Expression :

(function(){ ... })();

To se používá k udržení globálního rozsahu v čistotě. Ačkoli v tomto případě není nutné, protože vrácená hodnota je přiřazena proměnné Greeter. Jediný případ, kdy tento model je užitečné je, když chcete „soukromé“ statické členy.

Např:

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;
})();
Odpovězeno 02/10/2012 v 15:30
zdroj uživatelem

hlasů
3

Vedle zřejmého scopingu / uzavírací uvažování. Pomocí anonymní funkce, která vyvolá sám okamžitě předběžné zatížení (interpretuje) definici třídy. To umožní, aby JIT optimalizace být přední načten v provedení. Stručně řečeno, pro větší složitějších aplikacích zlepší výkon.

Odpovězeno 02/10/2012 v 15:44
zdroj uživatelem

hlasů
2

Toto opatření je nutné pro soukromé členy. V tomto příkladu, všichni členové jsou veřejné, takže vaše dvě stavby jsou rovnocenné. Nicméně, pokud chcete poskytnout pro soukromé členy budete muset schovat před volající rozsahu přes uzávěr. Tedy pokud máte vlastní člen jako tak:

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

Pravděpodobně byste dostat něco takového:

var Greeter = (function () {
    var greeting="";
    function Greeter(message) {
        greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + greeting;
    };
    return Greeter;
})();

Pozdrav proměnná bude dostupné pro všechny funkce definované uvnitř anonymní funkce, ale neviditelné všude jinde.

Odpovězeno 02/10/2012 v 15:36
zdroj uživatelem

hlasů
2

Anonymní funkce / provádí se samo uzávěr se obvykle používá k zapouzdření prostor tak, že pouze vrácená hodnota je přístupný mimo něj. (Nebo cokoli připojit k jiným objektům, jako jsou okna)

Odpovězeno 02/10/2012 v 15:31
zdroj uživatelem

hlasů
1

Anonymní funkce je pravděpodobně tam, aby se zabránilo název collition s ostatními částmi kódu. Myslet na to tímto způsobem, uvnitř anonymní funkce, můžete dokonce deklarovat proměnnou s názvem „$“ být co chcete, a zároveň být pomocí jQuery na jiných částech kódu bez konfliktu.

Odpovězeno 02/10/2012 v 15:31
zdroj uživatelem

hlasů
-4

Uzavření je jediným prostředkem, jak volat konstruktory s parametry:

var w = new Greeter("hello")

Existují i ​​jiné způsoby, ale vše komplikuje a s omezeními a nevýhodami.

Odpovězeno 18/07/2014 v 09:13
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more