Wiem już o tym apply
i call
ustawiam podobne funkcje this
(kontekst funkcji).
Różnica polega na sposobie, w jaki wysyłamy argumenty (ręczne vs tablica)
Pytanie:
Ale kiedy powinienem użyć tej bind()
metody?
var obj = {
x: 81,
getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
javascript
arrays
function
Royi Namir
źródło
źródło
call()
tobą przekazujesz argumenty indywidualnie iapply()
jako tablicę argumentów. Aby uzyskać więcej informacji, zapoznaj się z dołączoną dokumentacją, która powinna być w stanie w pełni odpowiedzieć na twoje pytanie.kind of weird there is not an existing question about this :
Co do tego. Jest tak prawdopodobnie dlatego, żebind()
został dodany po tym, jak pozostałe dwa już istniały w JavaScript 1.8.5 - ECMA-262, 5. edycja. Podczas gdycall()
iapply()
istnieją już od JavaScript 1.3 - ECMA-262 3. wydanie. SO ma takie pytania, jak: jaka jest różnica między połączeniem a zastosowaniem . Zgaduję tylko, bo sam się nad tym zastanawiałem.Odpowiedzi:
Stworzyłem to porównanie między obiektami funkcji, wywołaniami funkcji
call/apply
ibind
jakiś czas temu:.bind
pozwala ustawićthis
wartość teraz, jednocześnie umożliwiając wykonanie funkcji w przyszłości , ponieważ zwraca nowy obiekt funkcji.źródło
Użyj,
.bind()
gdy chcesz, aby ta funkcja była później wywoływana w określonym kontekście, przydatnym w zdarzeniach. Użyj.call()
lub,.apply()
jeśli chcesz natychmiast wywołać funkcję i zmodyfikować kontekst.Wywołaj / zastosuj natychmiast wywołaj funkcję, a
bind
zwróci funkcję, która, jeśli zostanie wykonana później, będzie miała ustawiony prawidłowy kontekst do wywołania oryginalnej funkcji. W ten sposób możesz zachować kontekst w asynchronicznych wywołaniach zwrotnych i zdarzeniach.Często to robię:
Używam go szeroko w Node.js do wywołań zwrotnych asynchronicznych, dla których chcę przekazać metodę członka, ale nadal chcę, aby kontekstem była instancja, która rozpoczęła akcję asynchroniczną.
Prosta, naiwna implementacja wiązania wyglądałaby następująco:
Jest więcej w tym (jak przekazywanie innych argumentów), ale możesz przeczytać o tym więcej i zobaczyć prawdziwą implementację w MDN .
Mam nadzieję że to pomoże.
źródło
bind
powraca.Wszystkie dołączają to do funkcji (lub obiektu), a różnica polega na wywołaniu funkcji (patrz poniżej).
call dołącza to do funkcji i natychmiast wykonuje funkcję:
bind dołącza to do funkcji i musi być wywoływane osobno w następujący sposób:
lub tak:
Zastosuj jest podobny do wywołania, z tym wyjątkiem, że pobiera obiekt podobny do tablicy, zamiast wymieniać argumenty pojedynczo:
źródło
"use strict"
aby uniknąć zastępowania takich zastrzeżonych słów kluczowych. +1.Przykłady zastosowania vs. połączenia i powiązania
Połączenie
Zastosować
Wiązać
Kiedy używać każdego z nich
Dzwoń i aplikuj są dość wymienne. Po prostu zdecyduj, czy łatwiej jest wysłać tablicę lub listę argumentów oddzieloną przecinkami.
Zawsze pamiętam, który to jest, pamiętając, że Call jest przecinkiem (lista oddzielona), a Apply jest Array.
Bind jest trochę inny. Zwraca nową funkcję. Wywołaj i zastosuj natychmiast uruchom bieżącą funkcję.
Bind jest świetny do wielu rzeczy. Możemy go użyć do curry funkcji, jak w powyższym przykładzie. Możemy wziąć prostą funkcję hello i zmienić ją w helloJon lub helloKelly. Możemy go również używać do wydarzeń takich jak onClick, w których nie wiemy, kiedy zostaną zwolnieni, ale wiemy, w jakim kontekście chcemy, aby były.
Odniesienie: codeplanet.io
źródło
call
iapply
, czy wynika z tego, że jeśli nie maszthis
metody wewnątrz, to przypisujesz pierwszy argument jakonull
?var person1 = {firstName: 'Jon', lastName: 'Kuperman'}; function say(greeting) { console.log(greeting + ' ' + this.firstName + ' ' + this.lastName); } say.apply(person1, ['Hello']); // Hello Jon Kuperman
Działa idealnie dobrze i wyświetla VM128: 4 Hello JonPozwala ustawić wartość
this
niezależną od sposobu wywoływania funkcji. Jest to bardzo przydatne podczas pracy z wywołaniami zwrotnymi:Aby osiągnąć ten sam wynik
call
, wyglądałoby to tak:źródło
.bind()
, co pokazałeś wcześniej, jest nieprawidłowe. Gdy użyjeszfn.bind(obj)
innej funkcji, zostanie zwrócona (nie wcześniej utworzona). I nie ma możliwości zmiany wartościthis
wnętrzabinded
funkcji. Najczęściej jest to wykorzystywane dothis
ubezpieczenia oddzwaniania . Ale w twoim przykładzie - nie ma różnic w wyniku. Alefn !== fn.bind(obj);
zauważ to.Załóżmy, że mamy
multiplication
funkcjęStwórzmy standardowe funkcje za pomocą
bind
var multiby2 = multiplication.bind(this,2);
Teraz multiby2 (b) jest równe mnożeniu (2, b);
Co jeśli przekażę oba parametry w powiązaniu
Teraz getSixAlways () jest równe mnożeniu (3,2);
nawet przekazanie parametru zwraca 6;
getSixAlways(12); //6
Tworzy to nową funkcję mnożenia i przypisuje ją do magicMultiplication.
O nie, ukrywamy funkcję mnożenia w magicMultiplication.
wywołanie
magicMultiplication
zwraca puste miejscefunction b()
po wykonaniu działa dobrze
magicMultiplication(6,5); //30
A może zadzwonisz i złożysz podanie?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
Krótko mówiąc,
bind
tworzy funkcjęcall
iapply
wykonuje funkcję, a jednocześnieapply
oczekuje parametrów w tablicyźródło
bind
tworzy funkcjęcall
iapply
wykonuje funkcję, a jednocześnieapply
oczekuje parametrów w tablicy”Zarówno
Function.prototype.call()
iFunction.prototype.apply()
wywołać funkcję z danejthis
wartości i powrót wartości zwracanej tej funkcji.Function.prototype.bind()
, z drugiej strony, tworzy nową funkcję o podanejthis
wartości i zwraca tę funkcję bez jej wykonania.Weźmy więc funkcję, która wygląda następująco:
A teraz weźmy obiekt, który wygląda następująco:
Możemy powiązać naszą funkcję z naszym obiektem w następujący sposób:
Teraz możemy uruchomić w
Obj.log
dowolnym miejscu naszego kodu:Ciekawe staje się wtedy, gdy nie tylko przypisujesz wartość
this
, ale również argumentprop
:Możemy teraz to zrobić:
źródło
bind : wiąże funkcję z podaną wartością i kontekstem, ale nie wykonuje funkcji. Aby wykonać funkcję, musisz wywołać funkcję.
call : Wykonuje funkcję z podanym kontekstem i parametrem.
Apply : Wykonuje funkcję z podanym kontekstem i parametrem jako tablica .
źródło
Oto jeden dobry artykuł , aby zilustrować różnicę między
bind()
,apply()
icall()
, podsumować, jak poniżej.bind()
pozwala nam łatwo ustawić, który konkretny obiekt będzie z tym związany, gdy zostanie wywołana funkcja lub metoda.bind()
pozwalają nam pożyczyć metodyJednym z problemów w tym przykładzie jest to, że dodajemy nową metodę
showData
docars
obiektu i możemy nie chcieć tego robić, aby pożyczyć metodę, ponieważ obiekt cars może już mieć nazwę właściwości lub metodyshowData
. Nie chcemy go przypadkowo zastąpić. Jak zobaczymy w naszym omówieniuApply
iCall
poniżej, najlepiej pożyczyć metodę za pomocą metodyApply
lubCall
.bind()
pozwól nam wywołać funkcjęFunkcja Currying , znana również jako aplikacja funkcji częściowej , to użycie funkcji (która akceptuje jeden lub więcej argumentów), która zwraca nową funkcję z niektórymi ustawionymi argumentami.
Możemy użyć
bind()
do curry tejgreet
funkcjiapply()
lubcall()
ustawić tę wartośćTe
apply
,call
orazbind
wszystkie metody są stosowane w celu ustawienia tej wartości podczas wywoływania metody, i robią to w nieco inny sposób, aby umożliwić zastosowanie bezpośrednią kontrolę i wszechstronność w naszym kodzie JavaScript.apply
Icall
metody są niemal identyczne przy ustalaniu tej wartości poza tym, że można przejść do parametrów funkcjiapply ()
jako macierzy , podczas gdy masz do listy parametrów indywidualnie przekazać je docall ()
metody.Oto jeden przykład użycia
call
lubapply
ustawienia tego w funkcji oddzwaniania.Pożycz funkcje za pomocą
apply
lubcall
Metody Borrow Array
Stwórzmy
array-like
obiekt i pożyczmy kilka metod tablicowych do działania na naszym obiekcie podobnym do tablicy.Innym częstym przypadkiem jest konwersja
arguments
na tablicę w następujący sposóbPożycz inne metody
Służy
apply()
do wykonywania funkcji zmiennej-arityJest
Math.max
to jeden przykład funkcji zmiennej-arity,Ale co, jeśli mamy tablicę liczb do przekazania
Math.max
? Nie możemy tego zrobić:To tutaj
apply ()
metoda pomaga nam wykonywać funkcje variadic . Zamiast powyższego musimy przekazać tablicę liczb za pomocąapply (
) w ten sposób:źródło
zadzwoń / zastosuj natychmiast wykonuje funkcję:
bind nie wykonuje funkcji natychmiast, ale zwraca opakowaną funkcję Apply (do późniejszego wykonania):
źródło
Składnia
Tutaj
źródło
Podstawowa różnica między Call, Apply i Bind to:
Powiązanie zostanie użyte, jeśli chcesz, aby kontekst wykonania pojawił się później na obrazie.
Dawny:
Powiedzmy, że chcę użyć tej metody w innej zmiennej
Aby użyć odniesienia do samochodu w innej zmiennej, powinieneś użyć
Porozmawiajmy o szerszym użyciu funkcji wiązania
Dlaczego? Ponieważ teraz func jest powiązany z numerem 1, jeśli nie użyjemy wiązania w tym przypadku, wskaże on obiekt globalny.
Połączenia, Zastosuj są używane, gdy chcesz wykonać instrukcję w tym samym czasie.
źródło
Zadzwoń, zastosuj i zwiąż. i jak się różnią.
Pozwala nauczyć się dzwonić i aplikować przy użyciu codziennej terminologii.
Masz trzy samochody,
your_scooter , your_car and your_jet
które zaczynają z tym samym mechanizmem (metodą). Stworzyliśmy obiektautomobile
za pomocą metodypush_button_engineStart
.Pozwala zrozumieć, kiedy jest używany i zadzwoń. Załóżmy, że jesteś inżynierem i tak jest
your_scooter
,your_car
ayour_jet
który nie był wyposażony w funkcję push_button_engine_start i chcesz korzystać z usług innej firmypush_button_engineStart
.Jeśli uruchomisz następujące wiersze kodu, dadzą błąd. DLACZEGO?
Tak więc powyższy przykład z powodzeniem nadaje twojemu skuterowi, twojemu samochodowi, twojemu atramentowi funkcję obiektu samochodowego.
Zanurkujmy głębiej Tutaj podzielimy powyższą linię kodu.
automobile.push_button_engineStart
pomaga nam uzyskać zastosowaną metodę.Ponadto używamy zastosowania lub połączenia za pomocą notacji kropkowej.
automobile.push_button_engineStart.apply()
Teraz zastosuj i zaakceptuj dwa parametry.
Tutaj ustawiamy kontekst w ostatnim wierszu kodu.
automobile.push_button_engineStart.apply(your_scooter,[20])
Różnica między wywołaniem a zastosowaniem polega na tym, że zastosowanie akceptuje parametry w postaci tablicy, podczas gdy wywołanie może po prostu zaakceptować listę argumentów oddzieloną przecinkami.
Co to jest funkcja JS Bind?
Funkcja powiązania to po prostu powiązanie kontekstu czegoś, a następnie zapisanie go w zmiennej do wykonania na późniejszym etapie.
Uczyńmy nasz poprzedni przykład jeszcze lepszym. Wcześniej używaliśmy metody należącej do obiektu samochodowego i używaliśmy jej do wyposażenia
your_car, your_jet and your_scooter
. Teraz wyobraźmy sobie, że chcemy osobno daćpush_button_engineStart
osobno, aby osobno uruchomić nasze samochody na dowolnym późniejszym etapie realizacji.nadal nie jesteś zadowolony?
Wyjaśnijmy to jak łzy. Czas na eksperyment. Wrócimy do wywołania i zastosowania aplikacji funkcji i spróbujemy zapisać wartość funkcji jako odniesienie.
Poniższy eksperyment kończy się niepowodzeniem, ponieważ wywołanie i zastosowanie są wywoływane natychmiast, dlatego nigdy nie przechodzimy do etapu przechowywania odwołania w zmiennej, w której funkcja wiązania kradnie przedstawienie
var test_function = automobile.push_button_engineStart.apply(your_scooter);
źródło
Wywołanie: wywołanie wywołuje funkcję i umożliwia przekazywanie argumentów jeden po drugim
Apply: Apply wywołuje funkcję i umożliwia przekazywanie argumentów jako tablicy
Bind: Bind zwraca nową funkcję, umożliwiając przekazanie w tej tablicy i dowolnej liczbie argumentów.
źródło
call (): - Tutaj przekazujemy argumenty funkcji indywidualnie, a nie w formacie tablicowym
apply (): - Tutaj przekazujemy argumenty funkcji w formacie tablicowym
bind (): -
źródło
Wywołanie JavaScript ()
Zastosuj JavaScript ()
** funkcje call i apply są różnicami call weź osobny argument, ale zastosuj tablicę take: [1,2,3] **
JavaScript bind ()
źródło
Wyobraź sobie, że powiązanie nie jest dostępne. możesz łatwo zbudować go w następujący sposób:
źródło
źródło
Główną koncepcją wszystkich tych metod jest zakrywanie funkcji .
Pożyczanie funkcji pozwala nam korzystać z metod jednego obiektu na innym obiekcie bez konieczności wykonywania kopii tej metody i utrzymywania jej w dwóch osobnych miejscach. Dokonuje się tego poprzez użycie. połączenie() , . Apply () lub. bind (), z których wszystkie istnieją, aby jawnie ustawić to na metodę, którą pożyczamy
Poniżej znajduje się przykład wszystkich tych metod
POŁĄCZENIE
ZASTOSOWAĆ
WIĄZAĆ
printMyNAme () to funkcja, która wywołuje tę funkcję
poniżej znajduje się link do jsfiddle
https://codepen.io/Arham11/pen/vYNqExp
źródło
Myślę, że są to te same miejsca: wszystkie mogą zmienić tę wartość funkcji. Różnice między nimi: funkcja bind zwróci w wyniku nową funkcję; metody wywołania i zastosowania natychmiast wykonają tę funkcję, ale funkcja Apply może zaakceptować tablicę jako parametry i przeanalizuje tablicę oddzielnie, a także funkcją wiązania może być Currying.
źródło
funkcja bind powinna być używana, gdy chcemy przypisać funkcję o określonym kontekście np.
w powyższym przykładzie, jeśli wywołamy funkcję demo.setValue () i przekażemy tę funkcję.getValue bezpośrednio, wówczas nie wywołuje ona funkcji demo.setValue bezpośrednio, ponieważ to w setTimeout odnosi się do obiektu okna, więc musimy przekazać kontekst obiektu demo do this.getValue funkcja za pomocą bind. oznacza to, że przekazujemy funkcję tylko w kontekście obiektu demonstracyjnego, który nie wywołuje funkcji.
Mam nadzieję, że rozumiesz .
Aby uzyskać więcej informacji, zapoznaj się z funkcją wiązania javascript
źródło