Kuo skiriasi call
ir apply
naudojimas funkcijai iškviesti?
var func = function() {
alert('hello!');
};
func.apply();
vs func.call();
Ar skiriasi abiejų minėtų metodų našumas? Kada geriausia naudoti call
, o ne apply
ir atvirkščiai?
Skirtumas tas, kad apply
leidžia iškviesti funkciją su argumentais
kaip masyvu; call
reikalauja, kad parametrai būtų aiškiai išvardyti. Naudingas mnemoninis simbolis yra "A - array ir C - comma."
Žiūrėkite MDN'dokumentaciją apie apply ir call.
Pseudosintaksė:
Funkcija.apply(valueForThis, arrayOfArgs)`
theFunction.call(valueForThis, arg1, arg2, ...)
Nuo ES6 taip pat yra galimybė `išplėsti
masyvą, kad jį būtų galima naudoti su funkcija call
, suderinamumą galite pamatyti čia.
Kodo pavyzdys:
function theFunction(name, profession) {
console.log("My name is " + name + " and I am a " + profession +".");
}
theFunction("John", "fireman");
theFunction.apply(undefined, ["Susan", "school teacher"]);
theFunction.call(undefined, "Claude", "mathematician");
theFunction.call(undefined, ...["Matthew", "physicist"]); // used with the spread operator
K. Scottas Allenas šiuo klausimu yra gražiai parašęs.
Iš esmės jie skiriasi tuo, kaip jie tvarko funkcijų argumentus.
Metodas apply() yra identiškas metodui call(), išskyrus tai, kad apply() kaip antrojo parametro reikalauja masyvo. Masyvas yra tikslinio metodo argumentai."
Taigi, jei norite, kad masyvas būtų naudojamas kaip masyvas:
// assuming you have f
function f(message) { ... }
f.call(receiver, "test");
f.apply(receiver, ["test"]);
Atsakydami į klausimą, kada naudoti kiekvieną funkciją, atsakome, kad jei nežinote, kiek argumentų perduosite, arba jei jie jau yra masyve ar į masyvą panašiame objekte (pvz., arguments
objektas, skirtas perduoti savo argumentus), naudokite apply
, jei nežinote, kiek argumentų perduosite. Kitais atvejais naudokite call
, nes argumentų nereikia suvynioti į masyvą.
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
Kai neperduodu jokių argumentų (kaip jūsų pavyzdyje), man labiau patinka call
, nes aš iškviečiu funkciją. apply
reikštų, kad funkciją taikote (neegzistuojantiems) argumentams.
Neturėtų būti jokių našumo skirtumų, išskyrus atvejus, kai naudojate apply
ir argumentus surašote į masyvą (pvz., f.apply(thisObject, [a, b, c])
vietoj f.call(thisObject, a, b, c)
). To neišbandžiau, todėl gali būti skirtumų, bet tai labai priklauso nuo naršyklės. Tikėtina, kad call
yra greitesnis, jei dar neturite argumentų masyve, o apply
yra greitesnis, jei turite.