Αντικείμενο Function Γλώσσας ECMAScript (Κλάση)

Οι συνάρτησεις του ECMAScript είναι πλήρως λειτουργικά αντικείμενα.

Το αντικείμενο (κλάση) Function

Το πιο ενδιαφέρον του ECMAScript μπορεί να είναι ότι οι συνάρτησεις είναι πλήρως λειτουργικοί αντικείμενα.

Η κλάση Function μπορεί να εκφράσει οποιαδήποτε συνάρτηση που ορίζει ο προγραμματιστής.

Η σύνταξη δημιουργίας συνάρτησης με τη χρήση της κλάσης Function είναι η εξής:

var function_name = new function()arg1, arg2, ..., argN, function_body)

στην παραπάνω μορφή, κάθε arg είναι μια παράμετρος, η τελευταία παράμετρος είναι το σώμα της συνάρτησης (το κώδικα που θα εκτελεστεί). Αυτές οι παραμέτρους πρέπει να είναι συμβολοσειρές.

Θυμάστε αυτή τη συνάρτηση;

function sayHi(sName, sMessage) {
  alert("Hello " + sName + sMessage);
}

μπορεί να οριστεί και ως εξής:

var sayHi 
= 
new Function("sName", "sMessage", "alert("Hello " + sName + sMessage);");

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

Δείτε αυτό το παράδειγμα:

function doAdd(iNum) {
  alert(iNum + 20);
}
function doAdd(iNum) {
  alert(iNum + 10);
}
doAdd(10);	//Εμφάνιση "20"

Κατάλαβες ότι η δεύτερη συνάρτηση επαναφέρει την πρώτη συνάρτηση, ώστε το doAdd(10) να εμφανίζει "20" αντί για "30".

Αν επαναγράψετε αυτό το κομμάτι κώδικα με την παρακάτω μορφή, το κονcept αυτό θα γίνει πιο σαφές:

var doAdd = new Function("iNum", "alert(iNum + 20)");
var doAdd = new Function("iNum", "alert(iNum + 10)");
doAdd(10);

Παρατηρήστε αυτό το κομμάτι κώδικα, φαίνεται σαφώς ότι η τιμή της doAdd έχει αλλάξει σε πυρήνα που δείχνει σε διαφορετικό αντικείμενο. Το όνομα της συνάρτησης είναι απλώς μια αναφορά στη συνάρτηση, συμπεριφέρεται όπως άλλα αντικείμενα. Μπορείτε ακόμα να κάνετε δύο μεταβλητές να δείχνουν στην ίδια συνάρτηση:

var doAdd = new Function("iNum", "alert(iNum + 10)");
var alsodoAdd = doAdd;
doAdd(10);	//Εμφάνιση "20"
alsodoAdd(10);	//Εμφάνιση "20"

Εδώ, η μεταβλητή doAdd ορίζεται ως συνάρτηση, και στη συνέχεια η alsodoAdd δηλώνεται ως πυρήνας που δείχνει στην ίδια συνάρτηση. Μπορείτε να εκτελέσετε τον κώδικα της συνάρτησης με αυτές τις δύο μεταβλητές και να εμφανίσετε τον ίδιο αποτέλεσμα - "20". Επομένως, αν το όνομα της συνάρτησης είναι απλώς μια αναφορά στη συνάρτηση, μπορείτε να τη μεταφέρετε ως παράμετρο σε άλλη συνάρτηση; Η απάντηση είναι θετική!

function callAnotherFunc(fnFunction, vArgument) {
  fnFunction(vArgument);
}
var doAdd = new Function("iNum", "alert(iNum + 10)");
callAnotherFunc(doAdd, 10);	//έξοδος "20"

Στο παραπάνω παράδειγμα, ο callAnotherFunc() έχει δύο παραμέτρους - την λειτουργία που θα καλέσει και τις παραμέτρους που θα περάσει στην λειτουργία. Αυτό το κείμενο κώδικα μεταφέρει την doAdd() στην λειτουργία callAnotherFunc(), με την παράμετρο 10, και η έξοδος είναι "20".

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

Η ιδιότητα length του αντικειμένου Function

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

Η ιδιότητα length που ορίζει το ECMAScript δηλώνει τον αριθμό των αναμενόμενων παραμέτρων της λειτουργίας. Για παράδειγμα:

function doAdd(iNum) {
  alert(iNum + 10);
}
function sayHi() {
  alert("Hi");
}
alert(doAdd.length);	//έξοδος "1"
alert(sayHi.length);	//έξοδος "0"

Η λειτουργία doAdd() ορίζει μια παράμετρο, οπότε η length της είναι 1;sayHi() δεν ορίζει παραμέτρους, οπότε η length της είναι 0.

Μπορείτε να θυμάστε ότι ανεξάρτητα από τον αριθμό των παραμέτρων που καθορίζονται, το ECMAScript μπορεί να δεχτεί οποιοδήποτε αριθμό παραμέτρων (μέχρι 25), αυτό έχει εξηγήσει στο κεφάλαιο "Εισαγωγή στις λειτουργίες". Η ιδιότητα length παρέχει μια απλή μέθοδο για να δείτε τον αριθμό των αναμενόμενων παραμέτρων κατά προεπιλογή.

Μεθόδοι του αντικειμένου Function

Το αντικείμενο Function έχει επίσης τις μεθόδους valueOf() και toString() που μοιράζονται όλες οι αντικείμενα. Αυτές οι μεθόδους επιστρέφουν τον κώδικα της λειτουργίας, είναι ιδιαίτερα χρήσιμες κατά τη διάρκεια της αποσφαλμάτωσης. Για παράδειγμα:

function doAdd(iNum) {
  alert(iNum + 10);
}
document.write(doAdd.toString());

Το παρακάτω κείμενο κώδικα εκτυπώνει τον κώδικα της λειτουργίας doAdd().Δοκιμάστε το προσωπικά!