困惑:为什么在jQuery中将字符串作为数组索引传递?

问题描述

| 我正在研究R Murphy的JQuery基础知识,并试图弄清她的解决方案: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函数的一种round回方式吗? 如果是这样,为什么不直接调用函数呢?即$ item.next();? 后续问题 也许我一直在看这段代码太久了,但是在我看来,在getItem()中的这一行中:
$items[(trav == \'next\') ? \'first\' : \'last\']();
trav永远不会\'下一步\'。但是,通过代码测试trav是否等于\'next \',这意味着在某些情况下trav!= \'next \'。但我无法确定任何这种情况。 我没看到什么?     

解决方法

代码需要根据参数的值是否为字符串“ next”来决定是否调用“ first”或“ last”函数。因此,它执行比较,使用结果在两个函数名称之间进行决策,然后将这些函数作为\“ $ item \”对象的属性进行访问,并最终调用所选择的函数。 JavaScript中的
[ ]
\“ operator \”不仅适用于数组。通常,它用于访问对象的属性:
object [ propertyName ]
以字符串形式计算\“ propertyName \”(可以是任何表达式),然后返回属性的值(或“ 5”)。如果对象是数组,则将对\“ propertyName \”的整数值进行特殊处理,但是这种处理是微妙的并且几乎是不可检测的,因为数值属性始终可以工作,因为它们可以清楚地转换为字符串值。     ,使用“标准”函数调用的另一种编写方法是:
var $returnItem = (trav == \'next\') ? $item.next() : $item.prev();
return $returnItem.length ? 
    $returnItem : 
        (trav == \'next\') ? $items.first() : $items.last();
正如Pointy很好地解释的那样,JavaScript通过“调用”它们作为对象的成员,从而允许以不同的方式调用作为“复杂”对象一部分的函数。也许这个基本的例子可以帮助您更好地理解它,如果您愿意,可以将其弄乱。 这样,作者只调用
$item
一次,而不是两次(与ѭ8calls相同),并且避免使用条件语句。     ,她实际上正在测试以查看是否有$ returnItem。如果是这样,该函数将返回该项目,如果不是,则检查是否为ѭ9gets,如果是则获取
$items
集合的第一个元素。如果trav不等于next,它将使用
$items[\'last\']
返回集合中的最后一个元素