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 person2console.log(person.fullName.call(person1)); // Output: John Doeconsole.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 person2console.log(person.fullName.apply(person1, ["New York", "USA"])); // Output: John Doe, New York, USAconsole.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 modulesconst http = require('http');// Create a server objecthttp.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 Aliceres.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 detailsfunction displayDetails(age, profession) {return this.name + " is " + age + " years old and works as a " + profession + ".";}// User objectsconst user1 = { name: 'Bob' };const user2 = { name: 'Alice' };// Use call to invoke displayDetailsconsole.log(displayDetails.call(user1, 30, 'Engineer')); // Output: Bob is 30 years old and works as a Engineer.// Use apply to invoke displayDetailsconsole.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.