Γιατί να ενσωματώσετε την κατηγορία JavaScript στον ανώνυμο λειτουργία () κλήση;

ψήφοι
17

Διάβαζα για το νέο Javascript για-όπως η γλώσσα από τη Microsoft που ονομάζεται γραφομηχανή . Στο παιδικής χαράς (παράδειγμα τμήμα) , υπάρχει μια απλή τάξη σε σύνταξη γραφομηχανή μετατρέπεται σε κώδικα JavaScript. Προερχόμενος από ένα υπόβαθρο προγραμματισμού Java, ήταν ενδιαφέρον για μένα να μάθουν πώς OOP γίνεται σε 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:

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

Το τμήμα γραφομηχανή είναι πολύ παρόμοια με Java, έτσι καταλαβαίνω αυτό. Τώρα η ερώτησή μου είναι γιατί το Javascript για το σώμα της Greeterκατηγορίας είναι ενσωματωμένο σε ένα ανώνυμο function()κλήση;

Γιατί να μην το γράψω, όπως αυτό;

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

Ποιο είναι το πλεονέκτημα / μειονέκτημα της κάθε μεθόδου;

Δημοσιεύθηκε 02/10/2012 στις 15:27
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
14

Ονομάζεται η ακόλουθη Αμέσως Κλήση Έκφραση Λειτουργία :

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

Είναι χρησιμοποιείται για να κρατήσει την παγκόσμια εμβέλεια καθαρό. Αν και, σε αυτή την περίπτωση δεν είναι απαραίτητο δεδομένου ότι η τιμή επιστροφής έχει εκχωρηθεί σε μια μεταβλητή 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;
})();
Απαντήθηκε 02/10/2012 στις 15:30
πηγή χρήστη

ψήφοι
3

Εκτός από την προφανή συλλογιστική οριοθέτησης / κλεισίματος. Χρησιμοποιώντας ένα ανώνυμο λειτουργία που η ίδια επικαλείται αμέσως προ-φορτία (ερμηνεύει) τον ορισμό κατηγορίας. Αυτό επιτρέπει τυχόν βελτιστοποιήσεις ΚΟΕ που πρόκειται να φορτωθεί εμπρός εντός της εκτέλεσης. Με λίγα λόγια, για μεγαλύτερο και πιο σύνθετες εφαρμογές που θα βελτιώσουν την απόδοση.

Απαντήθηκε 02/10/2012 στις 15:44
πηγή χρήστη

ψήφοι
2

Αυτό γίνεται για να καταστεί δυνατή η ιδιωτική μελών. Σε αυτό το παράδειγμα, όλα τα μέλη είναι δημόσιες, ώστε δύο κατασκευές σας είναι ισοδύναμες. Ωστόσο, αν θέλετε να παρέχουν για ιδιωτική μέλη θα πρέπει να τους κρύψουν από τον καλούντα πεδίο μέσω ενός κλεισίματος. Έτσι, αν έχετε ένα ιδιωτικό μέλος, όπως αυτό:

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

Θα πάρετε πιθανώς κάτι σαν αυτό:

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

Ο χαιρετισμός μεταβλητή θα είναι διαθέσιμη σε οποιαδήποτε λειτουργία ορίζεται μέσα στο ανώνυμο λειτουργία, αλλά αόρατες οπουδήποτε αλλού.

Απαντήθηκε 02/10/2012 στις 15:36
πηγή χρήστη

ψήφοι
2

Ο ανώνυμος λειτουργία / self κλεισίματος εκτέλεσης χρησιμοποιείται συνήθως για να ενθυλακώσει το πεδίο εφαρμογής, έτσι ώστε μόνο η τιμή που επιστρέφεται είναι προσβάσιμη έξω από αυτό. (Ή οτιδήποτε άλλο μπορείτε να επισυνάψετε σε άλλα αντικείμενα, όπως το παράθυρο)

Απαντήθηκε 02/10/2012 στις 15:31
πηγή χρήστη

ψήφοι
1

Η ανώνυμη λειτουργία είναι κατά πάσα πιθανότητα υπάρχει να αποτρέψει το όνομα collition με άλλα μέρη του κώδικα. Σκεφτείτε το αυτό τον τρόπο, μέσα στο ανώνυμο σας λειτουργία, θα μπορούσε ακόμη και να δηλώσει μια μεταβλητή που ονομάζεται «$» για να είναι ό, τι θέλετε, και την ίδια στιγμή, είναι με τη χρήση jQuery σε άλλα μέρη του κώδικα σας χωρίς σύγκρουση.

Απαντήθηκε 02/10/2012 στις 15:31
πηγή χρήστη

ψήφοι
-4

Το κλείσιμο είναι το μοναδικό μέσο για να καλέσει τους κατασκευαστές με παραμέτρους:

var w = new Greeter("hello")

Υπάρχουν και άλλες μέθοδοι αλλά όλα περιπλέκεται και με περιορισμούς και μειονεκτήματα.

Απαντήθηκε 18/07/2014 στις 09:13
πηγή χρήστη

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