Kutsun ja hakemuksen eron ymmärtäminen JavaScriptissä

Kutsun ja hakemuksen eron ymmärtäminen JavaScriptissä
Kutsun ja hakemuksen eron ymmärtäminen JavaScriptissä

Funktioiden kutsumismenetelmät JavaScriptissä

JavaScriptissä funktioita voidaan kutsua eri tavoin, ja kaksi yleisesti käytettyä menetelmää ovat "call" ja "apply". Näiden menetelmien avulla voit hallita kontekstia (tämä arvo), jossa funktio suoritetaan. "Call"- ja "apply"-sanomien välisen eron ymmärtäminen on ratkaisevan tärkeää tehokkaan ja toimivan JavaScript-koodin kirjoittamisen kannalta.

Tässä artikkelissa tarkastellaan funktioiden Function.prototype.call() ja Function.prototype.apply() välisiä eroja funktiota kutsuttaessa. Tutkimme niiden syntaksia, käyttötapauksia ja mahdollisia suorituskykyeroja. Tämän artikkelin loppuun mennessä sinulla on selkeä käsitys siitä, milloin "call" on käytettävä "apply"-komennolla ja päinvastoin.

Komento Kuvaus
Function.prototype.call() Kutsuu funktiota, jolla on annettu tämä arvo ja argumentit yksittäin.
Function.prototype.apply() Kutsuu funktiota, jolla on annettu tämä arvo, ja argumentit annetaan taulukkona.
this Viittaa objektiin, josta funktio kutsuttiin, mikä mahdollistaa dynaamisen kontekstin määrityksen.
console.log() Tulostaa viestejä tai muuttujia konsoliin virheenkorjausta varten.
res.writeHead() Asettaa HTTP-tilakoodin ja vastausotsikot Node.js-palvelimessa.
res.end() Lopettaa vastausprosessin Node.js-palvelimessa ilmoittaen, että kaikki tiedot on lähetetty.
http.createServer() Luo HTTP-palvelinesiintymän Node.js:ssä ja kuuntelee saapuvia pyyntöjä.
listen() Käynnistää HTTP-palvelimen ja antaa sen kuunnella tiettyä porttia.

Puhelun ja hakemuksen käytön ymmärtäminen JavaScriptissä

Toimitetut skriptit havainnollistavat käytön eroja Function.prototype.call() ja Function.prototype.apply() JavaScriptissä. Molempia menetelmiä käytetään funktioiden kutsumiseen määritetyllä tavalla this yhteydessä. Ensimmäisessä esimerkissä call() menetelmää käytetään kutsumaan fullName menetelmä eri kohteissa (person1 ja person2), välittää kunkin objektin ominaisuudet yksittäisinä argumentteina. Tämä menetelmä mahdollistaa tiiviin syntaksin, kun argumenttien määrä on tiedossa ja kiinteä. Toinen esimerkki havainnollistaa apply() menetelmä, joka on samanlainen kuin call() mutta se ottaa joukon argumentteja yksittäisten argumenttien sijaan. Tämä joustavuus on erityisen hyödyllinen, kun argumenttien määrä on muuttuva tai tulee taulukkolähteestä.

Node.js-taustaesimerkissä call() -menetelmää käytetään HTTP-palvelimessa, joka on luotu http.createServer(). Tämä esimerkki korostaa kuinka this kontekstia voidaan käsitellä palvelinpuolen JavaScriptissä, jotta se vastaa dynaamisesti HTTP-pyyntöihin. Palvelin vastaa tervehdyksellä ja osoittaa, kuinka call() menetelmä voi muuttaa kontekstia greet toiminto. Lopuksi yhdistetty käyttöliittymä- ja taustaosaesimerkki esittelee, kuinka molemmat call() ja apply() voidaan käyttää dynaamisemmassa toiminnossa. Käyttämällä call() yksittäisillä argumenteilla ja apply() Argumenttien joukolla komentosarja luo dynaamisesti käyttäjätietoja, havainnollistaen näiden menetelmien käytännön sovelluksia sekä asiakas- että palvelinpuolen JavaScript-kehityksessä.

JavaScriptin kutsu- ja soveltamismenetelmien käyttäminen funktion kutsumiseen

JavaScript-käyttöliittymän komentosarja

// 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

Function.prototype.apply():n käyttäminen joustavalle argumentille

JavaScript-käyttöliittymän komentosarja

// 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-taustaesimerkki Soita ja käytä

JavaScript-taustaohjelma, jossa on 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/');

Puhelun ja hakemuksen yhdistäminen dynaamiseen toimintoon

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.

Kontekstin manipuloinnin tutkiminen JavaScriptissä

Peruskäytön lisäksi call() ja apply(), nämä menetelmät voidaan yhdistää muihin JavaScript-ominaisuuksiin monimutkaisemman ja tehokkaamman koodin luomiseksi. Niitä käytetään usein esimerkiksi yhdessä bind(), joka palauttaa uuden funktion määritetyllä this arvo. Toisin kuin call() ja apply(), jotka kutsuvat funktion välittömästi, bind() voidaan käyttää luomaan sidottu funktio, joka voidaan kutsua myöhemmin johdonmukaisella kontekstilla. Tämä on erityisen hyödyllistä tapahtumien käsittelyssä, jossa haluat ehkä varmistaa, että funktio säilyttää tietyn objektin kontekstin, vaikka se suoritetaan eri ympäristöissä.

Toinen edistynyt käyttötapaus sisältää menetelmien lainaamisen yhdestä objektista käytettäväksi toisen kanssa. Tämä voidaan saavuttaa käyttämällä call() tai apply() sitoaksesi menetelmän tilapäisesti toiseen objektiin. Esimerkiksi taulukkomenetelmät, kuten slice() tai push() voidaan lainata ja soveltaa taulukon kaltaisiin objekteihin, kuten funktioiden argumenttiobjektiin. Tämä tekniikka mahdollistaa suuremman joustavuuden ja koodin uudelleenkäytettävyyden, koska se mahdollistaa menetelmien jakamisen eri objektien kesken ilman päällekkäisyyttä.

Yleisiä kysymyksiä Soita ja hae JavaScriptissä

  1. Mikä on tärkein ero call() ja apply()?
  2. Suurin ero on se call() hyväksyy luettelon argumenteista, vaikka apply() hyväksyy joukon argumentteja.
  3. Milloin kannattaa käyttää apply() yli call()?
  4. Sinun pitäisi käyttää apply() kun sinulla on joukko argumentteja tai sinun on välitettävä muuttuva määrä argumentteja funktiolle.
  5. Onko suorituskyvyssä eroja call() ja apply()?
  6. Yleensä näiden välillä ei ole merkittäviä suorituskykyeroja call() ja apply(). Mahdolliset erot ovat yleensä mitättömiä.
  7. Voi apply() käytetään matemaattisten menetelmien kanssa?
  8. Joo, apply() voidaan käyttää siirtämään joukko numeroita matemaattisille menetelmille, kuten Math.max() tai Math.min().
  9. Mikä on Function.prototype.bind()?
  10. bind() luo uuden funktion, jolla on kun sitä kutsutaan this avainsana asetettu annettuun arvoon siten, että annettu argumenttisarja edeltää mitä tahansa annettua uutta funktiota kutsuttaessa.
  11. Kuinka voi call() käyttää menetelmien lainaamiseen?
  12. Voit käyttää call() lainata menetelmiä yhdestä objektista ja käyttää niitä toisessa objektissa, mikä mahdollistaa menetelmän uudelleenkäytön kopioimatta funktiota.
  13. Onko mahdollista käyttää call() tai apply() rakentajien kanssa?
  14. Ei, konstruktoreita ei voi kutsua suoraan call() tai apply(). Sen sijaan voit käyttää Object.create() periytymismalleille.
  15. Mitä ovat taulukon kaltaiset objektit ja miten ne tehdään call() ja apply() työskentele heidän kanssaan?
  16. Taulukkomaiset objektit ovat objekteja, joilla on pituusominaisuus ja indeksoidut elementit. call() ja apply() voidaan käyttää näiden objektien käsittelemiseen ikään kuin ne olisivat taulukoita.

Yhteenveto puhelun ja hakemuksen käytöstä JavaScriptissä

JavaScriptissä, call() ja apply() ovat välttämättömiä hallinnassa this funktioiden sisällä. call() mahdollistaa yksittäisten argumenttien välittämisen, mikä tekee siitä sopivan tunnetuille ja kiinteille argumenteille. Verrattuna, apply() ottaa joukon argumentteja, mikä tarjoaa joustavuutta muuttujaargumenttiluetteloille. Molemmat menetelmät parantavat koodin uudelleenkäytettävyyttä ja dynaamisten toimintojen kutsumista, olipa kyseessä käyttöliittymäkehitys tai Node.js-ympäristö. Sen ymmärtäminen, milloin ja miten näitä menetelmiä käytetään tehokkaasti, on ratkaisevan tärkeää puhtaan ja tehokkaan JavaScript-koodin kirjoittamisessa.