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

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 I w JavaScript. Obie metody służą do wywoływania funkcji z określonym kontekst. W pierwszym przykładzie call() metoda służy do wywoływania metody metoda na różnych obiektach ( I ), 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 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 metoda jest używana na serwerze HTTP utworzonym za pomocą . Ten przykład pokazuje, jak 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 funkcjonować. Na koniec połączony przykład frontendu i backendu pokazuje, jak oba te elementy działają I można wykorzystać w bardziej dynamicznej funkcji. Używając call() z indywidualnymi argumentami i 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 I , 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 , która zwraca nową funkcję z określonym this wartość. w odróżnieniu I , które natychmiast wywołują funkcję, 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ą Lub aby tymczasowo powiązać metodę z innym obiektem. Na przykład metody tablicowe, takie jak 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.

  1. Jaka jest główna różnica pomiędzy I ?
  2. Główna różnica polega na tym akceptuje listę argumentów, podczas gdy akceptuje tablicę argumentów.
  3. Kiedy powinieneś użyć nad ?
  4. Powinieneś użyć gdy masz tablicę argumentów lub musisz przekazać do funkcji zmienną liczbę argumentów.
  5. Czy są różnice w wydajności pomiędzy I ?
  6. Ogólnie rzecz biorąc, nie ma między nimi znaczących różnic w wydajności I . Wszelkie różnice są zwykle pomijalne.
  7. Móc być używany z metodami matematycznymi?
  8. Tak, może służyć do przekazywania tablicy liczb do metod matematycznych, takich jak Lub .
  9. Co jest ?
  10. tworzy nową funkcję, która po wywołaniu ma swoją 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 być używany do pożyczania metod?
  12. Możesz użyć 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ć Lub z konstruktorami?
  14. Nie, konstruktorów nie można bezpośrednio wywoływać Lub . Zamiast tego możesz użyć dla wzorców dziedziczenia.
  15. Co to są obiekty tablicowe i jak to zrobić I pracować z nimi?
  16. Obiekty podobne do tablicy to obiekty posiadające właściwość długości i indeksowane elementy. I można używać do manipulowania tymi obiektami tak, jakby były tablicami.

W JavaScript, I są niezbędne do kontrolowania 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, 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.