2013-08-31 9 views
5

Jeśli pytasz mnie, aby uzyskać max tablicy, chciałbym po prostu zrobić:dlaczego dzwoni stosować na Math.max działa i bez doens't

var nums = [66,3,8,213,965,1,453]; 
Math.max.apply(Math, nums); 

oczywiście, mogę również zrobić: nums.sort (function (a, b) {return a - b} .pop (nums.length);

ale muszę być szczera, muszę wiedzieć DLACZEGO to działa - używając .apply (matematyka, nums) Jeżeli właśnie to zrobił.

Math.max(nums); 

które nie praca.

za pomocą Zastosuj, I przekazać Math jako ten - i nums dla tablicy. Ale chcę poznać zawiłości "dlaczego", że pierwszy działa, a drugi nie. Jaka magia się dzieje?

Jest coś fundamentalnego, o czym nie pakuję swoich mózgów. Czytałem kilka o "zadzwoń i aplikuj", ale wiele razy fajne sztuczki mogą być podobne do tych powyżej i czuję, że brakuje mi czegoś głębszego tutaj.

+0

Przeczytaj o tym, co ".apply" robi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply –

Odpowiedz

7

Jak można przeczytać tutaj o Function.prototype.apply, apply Wywołuje funkcję z danej wartości this i argumentów przedstawionych jako array. Tak więc drugi parametr funkcji apply akceptuje arrays, dlatego to działa.

Podczas Math.max() sama oczekuje dowolna liczba parametrów nie tablicą z nich:

Math.max(66,3,8,213,965,1,453) //will work 
Math.max([66,3,8,213,965,1,453]) //will not work 

Zazwyczaj będziesz używał apply za wywoływanie funkcji z parametrami dynamicznymi (np tworzone przez użytkowników), że nie zna numeru parametrów. Z drugiej strony, jeśli masz ustaloną liczbę parametrów, możesz łatwo przekazać je do funkcji Math.max().

+0

Ok, przekopię to, co mówisz i jestem już go trochę zaznajomiłem, ALE to, co przeoczyłem i co myślę, że wyjaśniłeś, to to, że zastosowanie pozwala mi "zmieniać" kontekst akceptacji. tak? –

+0

tak. oraz poświęcenie czasu na przeczytanie więcej o pierwszym parametrze 'apply', który zmienia' this' w wywołanej funkcji. –

Powiązane problemy