Περισσότερα
Ποια είναι η διαφορά μεταξύ call και apply;
Ποια είναι η διαφορά μεταξύ της χρήσης της κλήσης
και της εφαρμογής
για την κλήση μιας συνάρτησης;
var func = function() {
alert('hello!');
};
func.apply();
vs func.call();
Υπάρχουν διαφορές στην απόδοση μεταξύ των δύο προαναφερθέντων μεθόδων; Πότε είναι καλύτερο να χρησιμοποιείτε την call
έναντι της apply
και το αντίστροφο;
3002
3
Η διαφορά είναι ότι η
apply
σας επιτρέπει να καλέσετε τη συνάρτηση με τα `arguments
ως έναν πίνακα- ηcall
απαιτεί οι παράμετροι να απαριθμούνται ρητά. Ένα χρήσιμο μνημονικό είναι "A για array και C για comma."Ανατρέξτε στην τεκμηρίωση του MDN για τις [apply][1] και [call][2].
Ψευδοσύνταξη:
theFunction.apply(valueForThis, arrayOfArgs)
theFunction.call(valueForThis, arg1, arg2, ...)
Υπάρχει επίσης, από το ES6, η δυνατότητα να [
διαδώσετε
][3] τον πίνακα για χρήση με τη συνάρτησηcall
, μπορείτε να δείτε τις συμβατότητες [εδώ][4].Δείγμα κώδικα:
K. Scott Allen έχει ένα ωραίο άρθρο σχετικά με το θέμα.
Βασικά, διαφέρουν στον τρόπο με τον οποίο χειρίζονται τα ορίσματα συναρτήσεων.
Η μέθοδος apply() είναι πανομοιότυπη με την call(), με τη διαφορά ότι η apply() απαιτεί έναν πίνακα ως δεύτερη παράμετρο. Ο πίνακας αντιπροσωπεύει τα ορίσματα για τη μέθοδο-στόχο ",
Έτσι:
Για να απαντήσετε στο κομμάτι σχετικά με το πότε πρέπει να χρησιμοποιήσετε κάθε συνάρτηση, χρησιμοποιήστε την
apply
αν δεν γνωρίζετε τον αριθμό των ορίων που θα περάσετε, ή αν αυτά βρίσκονται ήδη σε έναν πίνακα ή ένα αντικείμενο που μοιάζει με πίνακα (όπως το αντικείμενοarguments
για να προωθήσετε τα δικά σας ορίσματα. Χρησιμοποιήστεcall
σε αντίθετη περίπτωση, αφού δεν υπάρχει'ανάγκη να τυλίξετε τα ορίσματα σε έναν πίνακα.Όταν δεν μεταβιβάζω ορίσματα (όπως στο παράδειγμά σας), προτιμώ το
call
αφού καλώ τη συνάρτηση. Τοapply
θα σήμαινε ότι εφαρμόζετε τη συνάρτηση στα (ανύπαρκτα) ορίσματα.Δεν θα πρέπει να υπάρχουν διαφορές στην απόδοση, εκτός ίσως αν χρησιμοποιήσετε την
apply
και τυλίξετε τα ορίσματα σε έναν πίνακα (π.χ.f.apply(thisObject, [a, b, c])
αντί γιαf.call(thisObject, a, b, c)
). Δεν το έχω δοκιμάσει, οπότε μπορεί να υπάρχουν διαφορές, αλλά αυτό θα είναι πολύ συγκεκριμένο για κάθε πρόγραμμα περιήγησης. Είναι πιθανό ότι ηcall
είναι ταχύτερη αν δεν έχετε ήδη τα ορίσματα σε έναν πίνακα και ηapply
είναι ταχύτερη αν τα έχετε.