24-讨论
7.5.3 讨论
简单的解决方案使用了回调功能,然后进入序列中的下一个动画。使用的选择器以第一个 div.box 为目标;但是,这样的方法不具备伸缩性,因为它预计有两个(且只有两个)动画元素。如果元素少于两个,代码就会中断,多于两个则会丢失一些元素。
如果动画序列中有更多(甚至未知个数)的元素,那么Dave Methvin的解决方案是完美的。
代码采用了两个技巧,第一个是使用空数组进行故障恢复:
$($boxes[div++] || [])
这段代码递增索引计数,如果元素不存在,则向jQuery传递一个空数组。
当jQuery结果集为空,运行一个没有任何效果的动画。因为结果为空,所以jQuery不向链式调用传递任何DOM元素,链式方法的任何回调也就不会调用。
例如,如果运行如下代码,警告框永远不会出现——这是本秘诀正常工作的关键因素:
$('made-up-element').show(function () {
alert('will never appear');
});
本秘诀的第二个技巧是回调参数:
arguments.callee
arguments 是JavaScript的一个关键字,它指代所有函数都能访问的一个局部变量。 arguments 对象类似于任何数组,但是没有任何数组方法(如 slice )或者除了 length 以外的属性。
arguments 还在 arguments.callee 属性中包含了当前执行函数的一个引用。这可用于递归函数调用,这正是在本解决方案中使用这个属性的方式。
这个解决方案在 $boxes jQuery 中持续递增,在动画完成时,递归执行函数。这一动作持续到 <div> 的索引超出 $boxes jQuery 集合的长度( $boxes.length) ,这时jQuery集合是一个空数组,因此不执行回调,代码也随之结束运行。