2010-11-23 20 views
0

Ich Javascript Probe auf dieser Seite lernen,seltsam Javascript Grammatik beim Aufruf einer Funktion

http://nofunc.org/AJAX_Star_Rating

meine Fragen sind (1),

für Funktion Funktion XY (e, v), es hat zwei Eingabeparameter e und v, aber es wird mit nur einem Parameter x = XY (e) aufgerufen, wie funktioniert es?

Frage (2), ich bin verwirrt darüber, was diese Funktion XY unten tut, besonders verwirrt über die Grammatik {'X':e.pageX,'Y':e.pageY} und v?o[v]:o, könnte jemand erklären, was meinen sie bitte?

var o=agent('msie')?{'X':event.clientX+document.documentElement.scrollLeft,'Y':event.clientY+document.documentElement.scrollTop}:{'X':e.pageX,'Y':e.pageY}; return(v?o[v]:o); } 

Vielen Dank im Voraus, George

+1

Ich habe schon mit diesem Plugin gearbeitet. Ich mag den knappen und kompakten Stil, in dem es geschrieben ist, nicht besonders. – JAL

+0

Zustimmen, Alex. Haben Sie alternative Beispiele, um den gleichen "Stern" -Effekt zu erzielen? :-) – George2

Antwort

1

function XY(e,v) ist ein Event-Handler. Das erste Argument ist das Ereignisobjekt, das an die Funktion übergeben wird, das zweite ist das betroffene Element. Die Funktion wird automatisch von Javascript aufgerufen, wenn das entsprechende Ereignis ausgelöst wird.

{'X':e:pageX, 'Y':e:pageY} sind nur Schlüssel-Wert-Paare. Im Wesentlichen ein "Array" mit Bezeichnern für jedes Element und einem diesem Bezeichner entsprechenden Wert. Streng genommen hat Javascript keine "Arrays". Sie werden Objekte genannt. Die Bezeichner heißen Eigenschaften.

v?o[v]:o übersetzt in if (v) return o[v]; else return o; Ternäre Ausdrücke, wie sie bekannt sind, erscheinen auch in der letzten Zeile. if (agent('msie')) var o={'X':event...}; else var o={'X':e.pageX,...};

+0

Danke! Ich bin verwirrt über "v? O [v]: o", da v nicht in der Funktion XY (e, v) erscheint, irgendwelche Ideen? Welchen Wert gibt es zurück? – George2

+1

Wie bereits erwähnt, ist 'v' - der zweite arg - das vom Ereignis betroffene Element. – stillstanding

+0

Ich möchte mit Ihnen bestätigen, dass wenn ich den Internet Explorer verwende, dann "{'X': event.clientX + document.body.scrollLeft, 'Y': event.clientY + document.body.scrollTop} "sollte ausgeführt werden, und" {'X': e.pageX, 'Y': e.pageY} "sollte nicht ausgeführt werden, korrigieren? – George2

1

JavaScript hat eine sehr lose Kopplung zwischen formalen Parametern und aktiven Parameter. Ihre Funktion function XY(e,v) kann in Wirklichkeit mit beliebig vielen Parametern aufgerufen werden. Parameter, die an der Aufrufseite nicht "gefüllt" sind, erhalten den speziellen Wert undefined. Wenn die Funktion mit mehr Parametern als in der Parameterliste aufgerufen wird, sind diese zusätzlichen Parameter über eine spezielle Variable arguments zugänglich. Dies ist ein Array-ish-Objekt aller aktiven Parameter, mit denen die Funktion aufgerufen wurde. (Also einschließlich derjenigen, die keine Namen haben.)

In Bezug auf Ihre zweite Frage, {} ist Objekt literal Notation. Im Grunde erstellen Sie dort und dann ein Objekt und legen seine Attribute X und Y fest.

Das v?o[v]:o Konstrukt ist das ternary operator für if-then-else. In Pseudocode können Sie es als if v then o[v] else o lesen. (Dies ist ähnlich zu C/C++, wenn Sie es schon einmal gesehen haben.)

+0

Danke! Ich bin verwirrt über "v? O [v]: o", da v nicht in der Funktion XY (e, v) erscheint, irgendwelche Ideen? Welchen Wert gibt es zurück? – George2

+0

Ich möchte mit Ihnen bestätigen, dass, wenn ich den Internet Explorer verwende, "{'X': event.clientX + document.body.scrollLeft, 'Y': event.clientY + document.body.scrollTop}" ausgeführt werden sollte , und "{'X': e.pageX, 'Y': e.pageY}" sollte nicht ausgeführt werden, richtig? – George2

Verwandte Themen