De ce încorpora clasa JavaScript într-o funcție anonimă () suna?

voturi
17

Am citit despre noul limbaj JavaScript-ca de la Microsoft numit masina de scris . In loc de joaca ( de exemplu secțiune) , există o simplă clasă în sintaxa dactilografiat convertit în cod JavaScript. Venind dintr - un mediu de programare Java, a fost interesant pentru mine să învețe cum OOP se face în JavaScript ca compilate din dactilografiate.

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

Și codul JavaScript echivalent:

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

Partea typescript este foarte similar cu Java asa ca inteleg asta. Acum , întrebarea mea este motivul pentru care în JavaScript corpul Greeterclasei este încorporat într - un anonim function()apel?

De ce nu-l scrie așa?

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

Care este avantajul / dezavantajul fiecărei metode?

Întrebat 02/10/2012 la 15:27
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
14

Se numește următorul text Expression Funcția Invocat Imediat :

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

Acesta este utilizat pentru a menține domeniul de aplicare la nivel mondial curat. Deși, în acest caz , nu este necesar , deoarece valoarea returnată este atribuit unei variabile Greeter. Singura dată când acest model este util este atunci când doriți „private“ statice membri.

De exemplu:

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;
})();
Publicat 02/10/2012 la 15:30
sursa de către utilizator

voturi
3

Pe lângă evidentă raționamentul de definire a domeniului / închidere. Folosind o funcție anonimă, care se invocă imediat pre-sarcini () interpretează definiția clasei. Acest lucru permite orice optimizări JIT să fie încărcate față în cadrul execuției. Pe scurt, pentru aplicații mai complexe mai mari va îmbunătăți performanța.

Publicat 02/10/2012 la 15:44
sursa de către utilizator

voturi
2

Acest lucru este de a permite membrilor privați. În acest exemplu, toți membrii sunt publice, astfel încât dvs. două construcții sunt echivalente. Cu toate acestea, dacă doriți să oferiți pentru membrii privați ai nevoie pentru a le ascunde din domeniul de aplicare printr-o închidere de asteptare. Astfel, dacă aveți un membru privat astfel:

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

V-ar lua, probabil, ceva de genul:

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

Variabila de salut va fi disponibil pentru orice funcție definită în interiorul funcției anonime, dar invizibile oriunde altundeva.

Publicat 02/10/2012 la 15:36
sursa de către utilizator

voturi
2

Închiderea executare funcție anonimă / de sine este de obicei folosit pentru a încapsula domeniul de aplicare, astfel încât numai valoarea returnată este accesibilă în afara acesteia. (Sau orice altceva vă atașați la alte obiecte, cum ar fi fereastra)

Publicat 02/10/2012 la 15:31
sursa de către utilizator

voturi
1

Funcția anonim este, probabil, acolo pentru a preveni numele collition cu alte părți ale codului. Ganditi-va acest fel, în interiorul funcția anonim, ai putea declara chiar și o variabilă numită „$“ pentru a fi orice doriți, și, în același timp, să fie folosind jQuery pe alte părți ale codului fără conflicte.

Publicat 02/10/2012 la 15:31
sursa de către utilizator

voturi
-4

Închiderea este singurul mijloc de a apela constructori cu parametri:

var w = new Greeter("hello")

Există și alte metode, dar toate complicat și cu limitări și dezavantaje.

Publicat 18/07/2014 la 09:13
sursa de către utilizator

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