2012-01-03 13 views
12

Jestem nieco zdezorientowany, w jaki sposób funkcje działają w javascript. Rozumiem, że wszystkie są przedmiotami, ale jak to zmienia, w jaki sposób użyłbym ich jako argumentów?Kiedy zadeklarować nową (anonimową) funkcję w javascript?

Na przykład, jeśli próbuję użyć funkcji oddzwaniania gdzie 2nd argumentem jest oceniany po 1000ms ...

$(this).fadeIn(1000,function(){alert('done fading in');}); 

Dlaczego nie mogę osiągnąć ten sam efekt z:

$(this).fadeIn(1000,alert('done fading in')); 

Jeśli to zrobię, ocenia oba jednocześnie. Oznacza to, że element (ten) zaniknie i pojawi się alert w tym samym czasie.

Kiedy wywołuję alert (arg), czy nie tworzę nowy obiekt, który przechodzi w funkcję fadeIn()?

Jak dokładnie to działa?

+0

dobre pytanie. Będę trzymać się tego jednego – OptimusCrime

+0

Dla kujonów językowych: Technika, którą chcesz, nazywa się * [zastosowanie częściowe] [1] *, często nazywana też * Currying *. Skutecznie chcesz nową funkcję, w której niektóre argumenty są poprawione, a inne nie. [1]: http://en.wikipedia.org/wiki/Partial_application –

+1

@nd: Nie, to nie jest to. W tym przykładzie nie ma currying ani częściowej oceny. Jeśli szukasz terminu, * funkcja anonimowa * to jest. Również * funkcje wyższego rzędu * dla funkcji, które przyjmują funkcje jako argumenty. – KaptajnKold

Odpowiedz

19

W ten

$(this).fadeIn(1000,alert('done fading in')); 

co robi fadeIn() postrzegają jako drugi argument? Jest to wynikiem nazywając

alert('done fading in') 

czynimy wywołanie alert() przed nazywając fadeIn().

W tym przypadku

$(this).fadeIn(1000,function(){alert('done fading in');}); 

mamy obiekt

function(){alert('done fading in');} 

który fadeIn() wywołuje we właściwym czasie.

2

W pierwszym wierszu drugim parametrem jest metoda. A w drugim wierszu jest wywołanie metody.

można również napisać to tak

function fadeInCallback() { 
    alert('done fading in'); 
} 

$(this).fadeIn(1000, fadeInCallback); 

Więc co możemy zrobić, to że mijamy w odniesieniu do fadeInCallback więc funkcja jQuery fadeIn mogą dzwonić fadeInCallback raz to się robi z blaknięcie.

Druga linia wykona

alert('done fading in'); 

przed executeing funkcję jQuery fadeIn

5

Kiedy piszesz:

$(this).fadeIn(1000,alert('done fading in')); 

masz funkcję o nazwie nadejścia połączenia immadiately umieszczając nazwę funkcji i nawiasy po tej nazwie. I zanikanie W wyniku tego połączenia jest przekazywane - jest to niezdefiniowane, ponieważ zwraca alert zawsze nieokreślony.

Kiedy piszesz

$(this).fadeIn(1000,function(){alert('done fading in');}); 

utworzyć obiekt funkcyjny i przekazać ten obiekt funkcyjny fadeIn.Po zakończeniu fadeIn może wywołać tę funkcję.

To jest taki sam jak:

// create function 
var callback = function() { alert('done fading in'); }; 
// and pass this function to fadeIn 
$(this).fadeIn(1000, callback); 

ale kiedy piszesz:

var callback = alert('done fading in'); 
$(this).fadeIn(1000, callback); 

wtedy wywołać alarm immadiately i przekazać do wartości fadeIn, ostrzegające zwroty - niezdefiniowana.

Powiązane problemy