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

时间:2011-04-14 13:11:38

标签: jquery

我正在研究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'。但我无法确定任何此类情况。

我没看到什么?

非常感谢, Ñ

3 个答案:

答案 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']

返回集合中的最后一个元素