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.
- Jaka jest główna różnica pomiędzy I ?
- Główna różnica polega na tym akceptuje listę argumentów, podczas gdy akceptuje tablicę argumentów.
- Kiedy powinieneś użyć nad ?
- Powinieneś użyć gdy masz tablicę argumentów lub musisz przekazać do funkcji zmienną liczbę argumentów.
- Czy są różnice w wydajności pomiędzy I ?
- Ogólnie rzecz biorąc, nie ma między nimi znaczących różnic w wydajności I . Wszelkie różnice są zwykle pomijalne.
- Móc być używany z metodami matematycznymi?
- Tak, może służyć do przekazywania tablicy liczb do metod matematycznych, takich jak Lub .
- Co jest ?
- 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.
- Jak można być używany do pożyczania metod?
- 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.
- Czy można skorzystać Lub z konstruktorami?
- Nie, konstruktorów nie można bezpośrednio wywoływać Lub . Zamiast tego możesz użyć dla wzorców dziedziczenia.
- Co to są obiekty tablicowe i jak to zrobić I pracować z nimi?
- 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.