Chciałem wywołać funkcję za pomocą metody zastosowania JavaScript. Działa dobrze, jeśli funkcja nie ma argumentów. to znaczy

function test()
{
  console.log(this);
}

body = document.getElementsByTagName("body")[0]; // shortcut to body element

test.apply(body); // returns [object HTMLBodyElement]

Ale nie mogę zrobić tego samego, aby wywołać funkcję, która ma argumenty:

function test(msg)
{
  console.log(msg);
}

body = document.getElementsByTagName("body")[0]; // shortcut to body element

test(this).apply(body); // mysteriously returns the correct result, then
// typeError: 'undefined' is not an object (evaluating "test(this).apply".

Powyższe przykłady są całkowicie trywialne, ale ziarno mojego pytania brzmi: jak korzystać z metody zastosowania (), aby wywołać funkcję z argumentami.

18
dkugappi 6 październik 2011, 19:37

3 odpowiedzi

Pierwsze zawiadomienie, które natychmiast wywołujesz swoją funkcję, linia:

test(this).apply(body);

Nie powiedzie się, ponieważ na początku zadzwonisz do funkcji test przechodzącej this jako argument , a następnie próbujesz uzyskać dostęp do właściwości apply w wyniku funkcji, który jest undefined, ponieważ Twoja funkcja nic nie zwraca.

Ten dostęp do wartości nieruchomości na wartości undefined daje wyjątek TypeError.

Teraz, zobaczmy, co właściwie chcesz zrobić, jeśli chcesz przejść wartość zmiennej body jako argumentu swojej funkcji, ustawiając zewnętrzną wartość this, jako this Wartość test, możesz zrobić:

test.apply(this, [body]);

Ale dlatego istnieje metoda call, gdy wiesz dokładnie, które argumenty przekazują, nie musisz tworzyć tablicy na nic, po prostu przechodzisz argumenty:

test.call(this, body);

Metoda apply jest naprawdę przydatna, gdy zajmujesz się na przykład dynamiczną liczbą argumentów, gdy wiesz, które argumenty chcą przejść, i nadal mają zdolność ustawienia wartości this {{x2} } To tylko to, czego potrzebujesz.

8
Christian C. Salvadó 6 październik 2011, 15:45

Z zastosowaniem wysyłasz szereg argumentów jako drugi argument:

test.apply(body,["Hello World"]);

Oto dokumentacja Zastosowania na Dokumentach MDN HTTPS: //developer.mozilla. Org / EN / JavaScript / Reference / Global_Objects / Funkcja / Zastosuj

6
bittersweetryan 6 październik 2011, 15:45

Pamiętaj, aby dodać argument:

test.apply(body, ["my message here"]);
0
bbg 6 październik 2011, 15:40