2012-07-18 41 views
1

目前我已经设定,这样,回调执行仅去年在堆栈

var elements = $('#one, $two, #three, #four, #six'); 

var _temp = 0; 
elements.hide(0, function(){ 
    /* by default, the callback will be performed to 
     every single element in stack */ 

    _temp++; // increment temporary cache 

    // perform actual callback only on last in list 
    if (_temp == elements.length) { 
     // do stuff 
    } 
}); 

但感觉错了,因为如果我想为另一个回调做同样低于241线,我必须重置_temp,而且,全局变量只是一团糟。

我怎么能简化这个?

+0

'hide'没有回调作为第一个参数。这没有任何意义。 – VisioN 2012-07-18 07:55:34

+0

Woops,是不是从脚本复制粘贴,忘记了0. – jolt 2012-07-18 08:04:04

回答

3

一种可能的方式是使用封闭:如果你想使用这个模式更多的时候,你可以创建它返回一个回调函数

var elements = $('#one, $two, #three, #four, #six'); 

elements.hide(0, (function(){ 
    var _temp = 0; 
    return function(){ 
     _temp++; // increment temporary cache 

     // perform actual callback only on last in list 
     if (_temp == elements.length) { 
      // do stuff 
     } 
    }; 
})()); 

另请注意,.hide()的持续时间为第一个参数。

+0

啊,总是关闭。 :( – jolt 2012-07-18 08:07:28

+0

它总是*是关闭 – 2012-07-18 08:07:47

+1

虽然,我可以建议,如果相同的回调将在文档中的其他地方使用,那么缓存自我调用函数的返回函数可能更合适,然后将它传递给'elements.hide()'而不是 – 2012-07-18 08:09:33

1

尝试在你的函数中使用一个静态变量。

+1

你的声明应该是一个注释,但不是答案 – VisioN 2012-07-18 07:59:55

+0

对不起,这是我第一次,我甚至不确定那是什么语言 – Chefire 2012-07-18 08:03:33

+0

而且我是试图获得15点声望才能给答案+1。 – Chefire 2012-07-18 08:04:13

0

还有没有临时变量的另一种方式,它可能是一些少一些可读性,并迫使你选择存储变量里面,但:

elements.hide(0, function(){ 
    // if last callback (compare raw DOMElements, because jQuery object aren't somehow similar) 
    if ($(this)[0] === elements.last()[0]) { 
     // do stuff 
    } 
}); 

缩小了一些线路,并执行诀窍。