我正在研究R Murphy的JQuery Fundamentals,并试图理解她的解决方案:slideshow.js。
她创建了以下功能(我删除了一些导航代码,以便专注于淡入淡出图像的核心功能):
fadeCallback = function() {
if (manualMode) { return; }
var $this = $(this),
$next = getItem($this, 'next'),
num = $this.prevAll().length + 1;
// set the timeout for showing
// the next item in 5 seconds
timeout = setTimeout(function() {
showItem($this, $next);
}, 5000);
};
在fadeCallback中,她调用getItem()来获取$ this的下一个兄弟:
getItem = function($item, trav) {
var $returnItem = $item[trav]();
return $returnItem.length ?
$returnItem :
$items[(trav == 'next') ? 'first' : 'last']();
},
我迷失了她在getItem()的第二个参数中使用'next'。这是在第一个参数'$(this)'上调用.next()jQuery函数的迂回方式吗?
如果是这样,为什么不直接调用该函数?即$ item.next();?
*关注问题* *
也许我一直在看这段代码但是在我看来,在getItem()里面,在行中:
$items[(trav == 'next') ? 'first' : 'last']();
trav永远不会不'next'。然而,由于代码测试trav是否等于'next',它意味着有些情况下trav!='next'。但我无法确定任何此类情况。
我没看到什么?
非常感谢, Ñ
答案 0 :(得分:2)
代码需要根据参数的值是否为字符串“next”来决定是调用“first”还是“last”函数。因此,它执行比较,使用结果来决定两个函数名称,然后访问函数作为“$ item”对象的属性,最后调用选择的任何函数。
JavaScript中的[ ]
“运算符”不仅适用于数组。通常,它用于访问对象的属性:
object [ propertyName ]
将“propertyName”(可以是任何表达式)计算为字符串,然后返回属性的值(或undefined
)。如果对象是一个数组,则稍微特别对待“propertyName”的整数值,但是这种处理是微妙的,几乎检测不到,因为数字属性总是可以工作,因为它们可以清楚地转换为字符串值
答案 1 :(得分:1)
使用“标准”函数调用来编写此代码的另一种方法是:
var $returnItem = (trav == 'next') ? $item.next() : $item.prev();
return $returnItem.length ?
$returnItem :
(trav == 'next') ? $items.first() : $items.last();
正如Pointy所解释的那样,JavaScript允许通过“调用”它们作为对象的成员来以不同的方式调用属于“复杂”对象的函数。也许this basic example会帮助你更好地理解这一点,如果你愿意,可以随意使用它。
通过这样做,作者只调用$item
一次而不是两次(与$items
相同)并避免条件语句。
答案 2 :(得分:0)
她实际上正在测试是否有$ returnItem。如果是,则函数返回该项,如果不是,则检查是否trav == next
并获取$items
集合的第一个元素(如果是)。如果trav不等于next,则使用$items['last']