Funksjonsanropsmetoder i JavaScript
I JavaScript kan funksjoner startes på forskjellige måter, og to vanlige metoder er "ringe" og "bruk". Disse metodene lar deg kontrollere konteksten ('denne' verdien) som funksjonen utføres i. Å forstå forskjellen mellom 'ringe' og 'søke' er avgjørende for å skrive effektiv og effektiv JavaScript-kode.
Denne artikkelen utforsker forskjellene mellom `Function.prototype.call()` og `Function.prototype.apply()` når du starter en funksjon. Vi vil undersøke deres syntaks, brukstilfeller og potensielle ytelsesforskjeller. Mot slutten av denne artikkelen vil du ha en klar forståelse av når du skal bruke "ringe" fremfor "søk" og omvendt.
Kommando | Beskrivelse |
---|---|
Function.prototype.call() | Kaller en funksjon med en gitt denne verdien og argumenter gitt individuelt. |
Function.prototype.apply() | Kaller en funksjon med en gitt denne verdien, og argumenter oppgitt som en matrise. |
this | Refererer til objektet som funksjonen ble kalt fra, noe som tillater dynamisk konteksttilordning. |
console.log() | Skriver ut meldinger eller variabler til konsollen for feilsøkingsformål. |
res.writeHead() | Angir HTTP-statuskoden og svarhodene i en Node.js-server. |
res.end() | Avslutter svarprosessen i en Node.js-server, og signaliserer at alle data er sendt. |
http.createServer() | Oppretter en HTTP-serverforekomst i Node.js, og lytter etter innkommende forespørsler. |
listen() | Starter HTTP-serveren, slik at den kan lytte på en spesifisert port. |
Forstå bruken av samtale og bruk i JavaScript
Skriptene som følger med illustrerer forskjellene mellom bruk Function.prototype.call() og Function.prototype.apply() i JavaScript. Begge metodene brukes til å starte funksjoner med en spesifisert this kontekst. I det første eksempelet call() metoden brukes til å påkalle fullName metode på forskjellige objekter (person1 og person2), og sender egenskapene til hvert objekt som individuelle argumenter. Denne metoden tillater en kortfattet syntaks når antallet argumenter er kjent og fast. Det andre eksemplet viser bruken av apply() metode, som ligner på call() men tar en rekke argumenter i stedet for individuelle. Denne fleksibiliteten er spesielt nyttig når antallet argumenter er variabelt eller kommer fra en matrisekilde.
I Node.js-backend-eksemplet er det call() metoden brukes i en HTTP-server opprettet med http.createServer(). Dette eksemplet fremhever hvordan this kontekst kan manipuleres i JavaScript på serversiden for å svare dynamisk på HTTP-forespørsler. Serveren svarer med en hilsen, og demonstrerer hvordan call() metoden kan endre konteksten til 1. 3 funksjon. Til slutt viser det kombinerte frontend- og backendeksemplet hvordan begge deler call() og apply() kan brukes i en mer dynamisk funksjon. Ved bruk av call() med individuelle argumenter og apply() med en rekke argumenter genererer skriptet dynamisk brukerdetaljer, og illustrerer de praktiske anvendelsene av disse metodene i JavaScript-utvikling på både klientsiden og serversiden.
Bruke kalle og bruke metoder i JavaScript for funksjonsanrop
JavaScript-frontend-skript
// Example 1: Using Function.prototype.call()
const person = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
};
const person1 = {
firstName: "John",
lastName: "Doe"
};
const person2 = {
firstName: "Jane",
lastName: "Smith"
};
// Call the fullName method on person1 and person2
console.log(person.fullName.call(person1)); // Output: John Doe
console.log(person.fullName.call(person2)); // Output: Jane Smith
Bruker Function.prototype.apply() for fleksibel argumentoverføring
JavaScript-frontend-skript
// Example 2: Using Function.prototype.apply()
const person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + ", " + city + ", " + country;
}
};
const person1 = {
firstName: "John",
lastName: "Doe"
};
const person2 = {
firstName: "Jane",
lastName: "Smith"
};
// Apply the fullName method with arguments on person1 and person2
console.log(person.fullName.apply(person1, ["New York", "USA"])); // Output: John Doe, New York, USA
console.log(person.fullName.apply(person2, ["London", "UK"])); // Output: Jane Smith, London, UK
Node.js Backend Eksempel Bruk av ring og søk
JavaScript Backend Script med Node.js
// Load the required modules
const http = require('http');
// Create a server object
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
// Example using call()
function greet() {
return 'Hello ' + this.name;
}
const user = { name: 'Alice' };
res.write(greet.call(user)); // Output: Hello Alice
res.end();
}).listen(3000);
console.log('Server running at http://localhost:3000/');
Kombiner samtale og søknad med en dynamisk funksjon
JavaScript Full Stack Script
// Define a function to display user details
function displayDetails(age, profession) {
return this.name + " is " + age + " years old and works as a " + profession + ".";
}
// User objects
const user1 = { name: 'Bob' };
const user2 = { name: 'Alice' };
// Use call to invoke displayDetails
console.log(displayDetails.call(user1, 30, 'Engineer')); // Output: Bob is 30 years old and works as a Engineer.
// Use apply to invoke displayDetails
console.log(displayDetails.apply(user2, [28, 'Doctor'])); // Output: Alice is 28 years old and works as a Doctor.
Utforske kontekstmanipulasjon i JavaScript
Utover den grunnleggende bruken av call() og apply(), kan disse metodene kombineres med andre JavaScript-funksjoner for å lage mer kompleks og kraftig kode. For eksempel brukes de ofte sammen med bind(), som returnerer en ny funksjon med en spesifisert this verdi. I motsetning til call() og apply(), som umiddelbart påkaller funksjonen, bind() kan brukes til å lage en bundet funksjon som kan kalles senere med en konsistent kontekst. Dette er spesielt nyttig i hendelseshåndtering, der du kanskje ønsker å sikre at en funksjon beholder konteksten til et bestemt objekt selv når den kjøres i forskjellige miljøer.
Et annet avansert bruksområde innebærer å låne metoder fra ett objekt for bruk med et annet. Dette kan oppnås ved å bruke call() eller apply() å binde en metode midlertidig til et annet objekt. For eksempel array-metoder som slice() eller push() kan lånes og brukes på array-lignende objekter som arguments-objektet i funksjoner. Denne teknikken gir større fleksibilitet og gjenbrukbarhet av kode, da den gjør det mulig å dele metoder på tvers av forskjellige objekter uten duplisering.
Vanlige spørsmål om ringe og søke i JavaScript
- Hva er hovedforskjellen mellom call() og apply()?
- Hovedforskjellen er det call() godtar en liste med argumenter, mens apply() aksepterer en rekke argumenter.
- Når bør du bruke apply() over call()?
- Du bør bruke apply() når du har en rekke argumenter eller trenger å sende et variabelt antall argumenter til en funksjon.
- Er det ytelsesforskjeller mellom call() og apply()?
- Generelt er det ingen signifikante ytelsesforskjeller mellom call() og apply(). Eventuelle forskjeller er vanligvis ubetydelige.
- Kan apply() brukes med matematiske metoder?
- Ja, apply() kan brukes til å sende en rekke tall til matematiske metoder som Math.max() eller Math.min().
- Hva er Function.prototype.bind()?
- bind() oppretter en ny funksjon som, når den kalles, har sin this nøkkelord satt til den angitte verdien, med en gitt sekvens av argumenter foran alle gitte når den nye funksjonen kalles.
- Hvordan kan call() brukes til å låne metoder?
- Du kan bruke call() å låne metoder fra ett objekt og bruke dem på et annet objekt, noe som gir mulighet for gjenbruk av metode uten å kopiere funksjonen.
- Er det mulig å bruke call() eller apply() med konstruktører?
- Nei, konstruktører kan ikke kalles direkte med call() eller apply(). I stedet kan du bruke Object.create() for arvemønstre.
- Hva er array-lignende objekter, og hvordan call() og apply() jobbe med dem?
- Array-lignende objekter er objekter som har en lengdeegenskap og indekserte elementer. call() og apply() kan brukes til å manipulere disse objektene som om de var arrays.
Oppsummering av bruken av samtale og bruk i JavaScript
I JavaScript, call() og apply() er avgjørende for å kontrollere this kontekst innenfor funksjoner. call() lar individuelle argumenter sendes, noe som gjør den egnet for kjente og faste argumenter. I motsetning, apply() tar en rekke argumenter, og gir fleksibilitet for variable argumentlister. Begge metodene forbedrer kodegjenbrukbarhet og dynamisk funksjonsanrop, enten det er i frontend-utvikling eller Node.js-miljøer. Å forstå når og hvordan du bruker disse metodene effektivt er avgjørende for å skrive ren, effektiv JavaScript-kode.