Zrozumienie różnicy między wywołaniem a zastosowaniem w JavaScript

Zrozumienie różnicy między wywołaniem a zastosowaniem w JavaScript
Zrozumienie różnicy między wywołaniem a zastosowaniem w JavaScript

Metody wywoływania funkcji w JavaScript

W JavaScript funkcje można wywoływać na różne sposoby, a dwie powszechnie używane metody to „call” i „apply”. Metody te pozwalają kontrolować kontekst (wartość „this”), w którym wykonywana jest funkcja. Zrozumienie różnicy pomiędzy „call” i „apply” jest kluczowe dla pisania wydajnego i efektywnego kodu JavaScript.

W tym artykule omówiono różnice między funkcjami „Function.prototype.call()” i „Function.prototype.apply()” podczas wywoływania funkcji. Przeanalizujemy ich składnię, przypadki użycia i potencjalne różnice w wydajności. Pod koniec tego artykułu będziesz już wiedział, kiedy używać „zadzwoń” zamiast „zastosuj” i odwrotnie.

Komenda Opis
Function.prototype.call() Wywołuje funkcję z podaną tą wartością i argumentami podanymi indywidualnie.
Function.prototype.apply() Wywołuje funkcję z podaną wartością i argumentami podanymi w postaci tablicy.
this Odwołuje się do obiektu, z którego wywołano funkcję, umożliwiając dynamiczne przypisanie kontekstu.
console.log() Drukuje komunikaty lub zmienne na konsoli w celu debugowania.
res.writeHead() Ustawia kod stanu HTTP i nagłówki odpowiedzi na serwerze Node.js.
res.end() Kończy proces odpowiedzi w serwerze Node.js, sygnalizując, że wszystkie dane zostały wysłane.
http.createServer() Tworzy instancję serwera HTTP w Node.js, nasłuchującą przychodzących żądań.
listen() Uruchamia serwer HTTP, umożliwiając mu nasłuchiwanie na określonym porcie.

Zrozumienie użycia wywołań i zastosowania w JavaScript

Dostarczone skrypty ilustrują różnice pomiędzy użyciem Function.prototype.call() I Function.prototype.apply() w JavaScript. Obie metody służą do wywoływania funkcji z określonym this kontekst. W pierwszym przykładzie call() metoda służy do wywoływania metody fullName metoda na różnych obiektach (person1 I person2), przekazując właściwości każdego obiektu jako indywidualne argumenty. Ta metoda pozwala na zwięzłą składnię, gdy liczba argumentów jest znana i stała. Drugi przykład ilustruje użycie metody apply() metoda podobna do call() ale pobiera tablicę argumentów zamiast pojedynczych. Ta elastyczność jest szczególnie przydatna, gdy liczba argumentów jest zmienna lub pochodzi ze źródła tablicowego.

W przykładzie backendu Node.js plik call() metoda jest używana na serwerze HTTP utworzonym za pomocą http.createServer(). Ten przykład pokazuje, jak this kontekstem można manipulować w JavaScript po stronie serwera, aby dynamicznie odpowiadać na żądania HTTP. Serwer odpowiada pozdrowieniem, demonstrując, w jaki sposób call() Metoda może zmienić kontekst greet funkcjonować. Na koniec połączony przykład frontendu i backendu pokazuje, jak oba te elementy działają call() I apply() można wykorzystać w bardziej dynamicznej funkcji. Używając call() z indywidualnymi argumentami i apply() za pomocą tablicy argumentów skrypt dynamicznie generuje szczegóły użytkownika, ilustrując praktyczne zastosowania tych metod zarówno w programowaniu JavaScript po stronie klienta, jak i serwera.

Wykorzystanie metod wywoływania i stosowania w JavaScript do wywoływania funkcji

Skrypt frontendowy JavaScript

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

Stosowanie funkcji Function.prototype.apply() do elastycznego przekazywania argumentów

Skrypt frontendowy JavaScript

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

Przykład zaplecza Node.js Korzystanie z wywołania i zastosowania

Skrypt backendowy JavaScript z 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/');

Łączenie wywołania i zastosowania z funkcją dynamiczną

Pełny skrypt JavaScript

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

Odkrywanie manipulacji kontekstem w JavaScript

Poza podstawowym użyciem call() I apply(), metody te można łączyć z innymi funkcjami JavaScript, aby utworzyć bardziej złożony i wydajny kod. Na przykład często są używane w połączeniu z bind(), która zwraca nową funkcję z określonym this wartość. w odróżnieniu call() I apply(), które natychmiast wywołują funkcję, bind() można użyć do utworzenia powiązanej funkcji, którą można wywołać później w spójnym kontekście. Jest to szczególnie przydatne w obsłudze zdarzeń, gdzie możesz chcieć mieć pewność, że funkcja zachowa kontekst konkretnego obiektu, nawet jeśli jest wykonywana w różnych środowiskach.

Inny zaawansowany przypadek użycia polega na pożyczaniu metod z jednego obiektu do użycia z innym. Można to osiągnąć za pomocą call() Lub apply() aby tymczasowo powiązać metodę z innym obiektem. Na przykład metody tablicowe, takie jak slice() Lub push() można wypożyczać i stosować do obiektów tablicowych, takich jak obiekt arguments w funkcjach. Technika ta pozwala na większą elastyczność i możliwość ponownego użycia kodu, ponieważ umożliwia współdzielenie metod pomiędzy różnymi obiektami bez powielania.

Często zadawane pytania dotyczące dzwonienia i aplikowania w JavaScript

  1. Jaka jest główna różnica pomiędzy call() I apply()?
  2. Główna różnica polega na tym call() akceptuje listę argumentów, podczas gdy apply() akceptuje tablicę argumentów.
  3. Kiedy powinieneś użyć apply() nad call()?
  4. Powinieneś użyć apply() gdy masz tablicę argumentów lub musisz przekazać do funkcji zmienną liczbę argumentów.
  5. Czy są różnice w wydajności pomiędzy call() I apply()?
  6. Ogólnie rzecz biorąc, nie ma między nimi znaczących różnic w wydajności call() I apply(). Wszelkie różnice są zwykle pomijalne.
  7. Móc apply() być używany z metodami matematycznymi?
  8. Tak, apply() może służyć do przekazywania tablicy liczb do metod matematycznych, takich jak Math.max() Lub Math.min().
  9. Co jest Function.prototype.bind()?
  10. bind() tworzy nową funkcję, która po wywołaniu ma swoją this słowo kluczowe ustawione na podaną wartość, z podaną sekwencją argumentów poprzedzającą dowolne podane podczas wywoływania nowej funkcji.
  11. Jak można call() być używany do pożyczania metod?
  12. Możesz użyć call() pożyczać metody z jednego obiektu i używać ich w innym obiekcie, umożliwiając ponowne użycie metody bez kopiowania funkcji.
  13. Czy można skorzystać call() Lub apply() z konstruktorami?
  14. Nie, konstruktorów nie można bezpośrednio wywoływać call() Lub apply(). Zamiast tego możesz użyć Object.create() dla wzorców dziedziczenia.
  15. Co to są obiekty tablicowe i jak to zrobić call() I apply() pracować z nimi?
  16. Obiekty podobne do tablicy to obiekty posiadające właściwość długości i indeksowane elementy. call() I apply() można używać do manipulowania tymi obiektami tak, jakby były tablicami.

Podsumowanie użycia wywołań i zastosowania w JavaScript

W JavaScript, call() I apply() są niezbędne do kontrolowania this kontekst w ramach funkcji. call() umożliwia przekazywanie poszczególnych argumentów, dzięki czemu nadaje się do znanych i stałych argumentów. W przeciwieństwie, apply() pobiera tablicę argumentów, zapewniając elastyczność w przypadku zmiennych list argumentów. Obie metody zwiększają możliwość ponownego użycia kodu i dynamiczne wywoływanie funkcji, zarówno w środowisku programistycznym frontend, jak i w środowiskach Node.js. Zrozumienie, kiedy i jak skutecznie używać tych metod, ma kluczowe znaczenie dla pisania czystego i wydajnego kodu JavaScript.