Ποια είναι η διαφορά μεταξύ call και apply;

Ποια είναι η διαφορά μεταξύ της χρήσης της κλήσης και της εφαρμογής για την κλήση μιας συνάρτησης;

var func = function() {
  alert('hello!');
};

func.apply(); vs func.call();

Υπάρχουν διαφορές στην απόδοση μεταξύ των δύο προαναφερθέντων μεθόδων; Πότε είναι καλύτερο να χρησιμοποιείτε την call έναντι της apply και το αντίστροφο;

Λύση

Η διαφορά είναι ότι η 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].

Δείγμα κώδικα:

Σχόλια (12)

K. Scott Allen έχει ένα ωραίο άρθρο σχετικά με το θέμα.

Βασικά, διαφέρουν στον τρόπο με τον οποίο χειρίζονται τα ορίσματα συναρτήσεων.

Η μέθοδος apply() είναι πανομοιότυπη με την call(), με τη διαφορά ότι η apply() απαιτεί έναν πίνακα ως δεύτερη παράμετρο. Ο πίνακας αντιπροσωπεύει τα ορίσματα για τη μέθοδο-στόχο &quot,

Έτσι:

// assuming you have f
function f(message) { ... }
f.call(receiver, "test");
f.apply(receiver, ["test"]);
Σχόλια (2)

Για να απαντήσετε στο κομμάτι σχετικά με το πότε πρέπει να χρησιμοποιήσετε κάθε συνάρτηση, χρησιμοποιήστε την apply αν δεν γνωρίζετε τον αριθμό των ορίων που θα περάσετε, ή αν αυτά βρίσκονται ήδη σε έναν πίνακα ή ένα αντικείμενο που μοιάζει με πίνακα (όπως το αντικείμενο arguments για να προωθήσετε τα δικά σας ορίσματα. Χρησιμοποιήστε call σε αντίθετη περίπτωση, αφού δεν υπάρχει'ανάγκη να τυλίξετε τα ορίσματα σε έναν πίνακα.

f.call(thisObject, a, b, c); // Fixed number of arguments

f.apply(thisObject, arguments); // Forward this function's arguments

var args = [];
while (...) {
    args.push(some_value());
}
f.apply(thisObject, args); // Unknown number of arguments

Όταν δεν μεταβιβάζω ορίσματα (όπως στο παράδειγμά σας), προτιμώ το call αφού καλώ τη συνάρτηση. Το apply θα σήμαινε ότι εφαρμόζετε τη συνάρτηση στα (ανύπαρκτα) ορίσματα.

Δεν θα πρέπει να υπάρχουν διαφορές στην απόδοση, εκτός ίσως αν χρησιμοποιήσετε την apply και τυλίξετε τα ορίσματα σε έναν πίνακα (π.χ. f.apply(thisObject, [a, b, c]) αντί για f.call(thisObject, a, b, c)). Δεν το έχω δοκιμάσει, οπότε μπορεί να υπάρχουν διαφορές, αλλά αυτό θα είναι πολύ συγκεκριμένο για κάθε πρόγραμμα περιήγησης. Είναι πιθανό ότι η call είναι ταχύτερη αν δεν έχετε ήδη τα ορίσματα σε έναν πίνακα και η apply είναι ταχύτερη αν τα έχετε.

Σχόλια (0)