什么是阻止递归回调的最佳方法?

时间:2014-10-12 12:23:17

标签: javascript jquery

我正在尝试使用jquery库'jquery.transit'进行元素抖动,这是代码。

var s = $('myele');
var randomTran = function(){
    var rh = Math.floor((Math.random() * 10) - 5),
        rv = Math.floor((Math.random() * 10) - 5);
    s.transit({x:rh,y:rv},50,randomTran)
    }

问题是元素会不断摇晃,我需要在递归回调中添加一些停止符号。我能想到的是将函数外部的变量设置为标志。

var s = $('myele');
var flag = 0;
var randomTran = function(){
    if (flag<6) {
        var rh = Math.floor((Math.random() * 10) - 5),
        rv = Math.floor((Math.random() * 10) - 5);
        s.transit({x:rh,y:rv},50,randomTran)
    };
    flag++;
    }

但有了这个,我闻到了全球变量的恶臭。问题1是否有更好的方法来做到这一点? 问题2:是否有任何可以使元素震动的插件?

2 个答案:

答案 0 :(得分:4)

你可以在没有全局的情况下做同样的事情:

var randomTran = function(flag){
  flag = flag || 0;
  if (flag<6) {
    var rh = Math.floor((Math.random() * 10) - 5),
        rv = Math.floor((Math.random() * 10) - 5);
    s.transit({x:rh,y:rv},50,randomTran.bind(this, ++flag))
  };
}

除了s之外,这不依赖于任何外部变量,并且如上所述,不需要您修改任何其他代码。

答案 1 :(得分:0)

为什么要把它全球化?您只需将其附加到s对象即可。

var s = $('myele');
s.shakesLeft = 10;

var randomTran = function() {
    if (s.shakesLeft--) {
        var rh = Math.floor((Math.random() * 10) - 5),
            rv = Math.floor((Math.random() * 10) - 5);
        s.transit({x:rh,y:rv},50,randomTran)
    }
}