странная грамматика JavaScript при вызове функции - PullRequest
0 голосов
/ 23 ноября 2010

Я изучаю образец javascript с этой страницы,

http://nofunc.org/AJAX_Star_Rating

мои вопросы (1),

для функции-функции XY (e, v),у него есть два входных параметра e и v, но он вызывается только с одним параметром x = XY (e), как он работает?

вопрос (2), я не совсем понимаю, что делает эта функция XYниже, особенно запутанный в грамматике {'X':e.pageX,'Y':e.pageY} и v?o[v]:o, кто-нибудь может объяснить, что они означают, пожалуйста?

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); }

заранее спасибо, Джордж

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

function XY(e,v) - обработчик событий.Первый аргумент - это объект события, переданный функции, второй - затронутый элемент.Функция вызывается автоматически Javascript, когда происходит соответствующее событие.

{'X':e:pageX, 'Y':e:pageY} - это просто пары ключ-значение.По сути, это «массив» с идентификаторами для каждого элемента и значением, соответствующим этому идентификатору.Строго говоря, у Javascript нет «массивов».Они называются объектами.Идентификаторы называются свойствами.

v?o[v]:o переводится в if (v) return o[v]; else return o; Тернарные выражения, как они известны, также появляются в последней строке.if (agent('msie')) var o={'X':event...}; else var o={'X':e.pageX,...};

1 голос
/ 23 ноября 2010

JavaScript имеет очень слабую связь между формальными параметрами и активными параметрами. Ваша функция function XY(e,v) в действительности может вызываться с любым количеством параметров. Параметры, которые не «заполнены» на сайте вызова, получают специальное значение undefined. Когда функция вызывается с большим количеством параметров, чем в списке параметров, эти дополнительные параметры доступны через специальную переменную arguments. Это объект массива всех активных параметров, с которыми была вызвана функция. (Так, включая те, у которых нет имен.)

Что касается вашего второго вопроса, {} - это буквенная нотация объекта. Вы тут же создаете объект и устанавливаете его атрибуты X и Y.

Конструкция v?o[v]:o является троичным оператором для if-then-else. В псевдокоде вы можете прочитать его как if v then o[v] else o. (Это похоже на C / C ++, если вы видели это раньше.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...