【问题标题】:How to have a method call itself with parameters without a stack overflow如何在没有堆栈溢出的情况下使用参数调用自己的方法
【发布时间】:2014-03-14 01:13:45
【问题描述】:

下面的GSAP代码由于函数调用本身不起作用,因此无限循环并填满堆栈

var electrons = document.querySelectorAll('.electron'),
    paths = document.querySelectorAll('.path'),
    startDuration = 2;
for(var i = 0; i < electrons.length; i++) {
  var myDelay = -(i * 0.5);  
  orbit(electrons[i], paths[i], myDelay);  
}
function orbit(electron, path, delay) {
  TweenLite.to(electron, startDuration, {rotationY:'-360', ease:Linear.easeNone, 
               onComplete: orbit(electron, path, delay)}, delay);
  TweenLite.to(path, startDuration, {rotationZ:'360', ease:Linear.easeNone}, 
               delay);
}

为什么在动画完成之前onComplete函数被放入堆栈?

如果我从 onComplete 轨道函数调用中删除参数,它会进入方法,但由于没有给出参数而给我一个错误

我尝试通过单独的函数运行它,例如 function inBetween(1,2,3) { orbit(1,2,3); },但该方法不起作用(如我所料)

我需要这样做的原因是,如果我将所有电子放在同一个 TweenLite 上,它们将等待其他电子完成。由于我有负面延误,这对我来说是不可接受的

Here's a demo 供你玩,如果你愿意的话

您对如何解决这种情况有任何想法吗?

【问题讨论】:

  • 为什么要使用负延迟?看来您应该将其设置为 1。
  • @JamesBlack 负延迟是为了抵消电子,因此看起来不太同步

标签: javascript stack stack-overflow method-chaining gsap


【解决方案1】:

它希望onComplete 是一个函数,试试这个:

TweenLite.to(electron, startDuration, {
        rotationY:'-360',
        ease:Linear.easeNone, 
        onComplete: function(){
            orbit(electron, path, delay);
        }
    },delay);

【讨论】:

  • 没有任何错误,但它没有循环。有什么想法吗?
  • @ZachSaucier:在orbit(electron, path, delay); 之前发出警报,检查是否被调用。
  • 确实被调用了。事实上,它每两秒重复一次。那一定是我的功能有问题,我需要以某种方式重置它
  • 我需要的onComplete 函数是onComplete: function(){ elem.restart(); }。感谢您的帮助!
猜你喜欢
  • 2012-05-01
  • 2012-04-23
  • 2013-08-03
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多