调用函数时奇怪的javascript语法

时间:2010-11-23 15:46:30

标签: javascript html internet-explorer

我正在从这个页面学习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 个答案:

答案 0 :(得分:1)

JavaScript在形式参数和活动参数之间存在非常松散的耦合。您的函数function XY(e,v)实际上可以使用任意数量的参数进行调用。未在呼叫站点“填充”的参数将获得特殊值undefined。当使用比参数列表中的参数更多的参数调用函数时,可以通过特殊变量arguments访问这些额外参数。这是调用函数的所有活动参数的Array-ish对象。 (所以,包括那些没有名字的人。)

关于第二个问题,{}是对象文字符号。您基本上在那里创建一个对象,然后设置其XY属性。

v?o[v]:o构造是if-then-else的ternary operator。在伪代码中,您可以将其读作if v then o[v] else o。 (这与C / C ++类似,如果你以前见过它。)

答案 1 :(得分:1)

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,...};