【问题标题】:Is continuation-style-programming prone to stack overflow延续式编程是否容易发生堆栈溢出
【发布时间】:2011-06-29 21:31:21
【问题描述】:

针对this question关于jQuery效果的回应,我考虑过使用callback参数到.fadeIn( 500, my_function )

虽然原则上这是一个可行的想法,但我不知道(如果允许回调递归,jQuery 文档也没有 :( ):

function keep_animating(){
   $("#id").fadeIn(500).fadeOut(500, keep_animating );
}

【问题讨论】:

    标签: jquery recursion continuations


    【解决方案1】:

    您可以添加调试器断点并测试堆栈大小是否增加。 :)

    但是,由于动画/淡入淡出使用 setTimeout/setInterval,我高度猜测调用深度不会增加,即它不容易发生堆栈溢出。

    【讨论】:

    • 从我在源代码中看到的,它确实是递归的。请参阅speed function,它最终处理来自所有效果的回调函数。它使用call()直接执行回调,不涉及队列。
    • 您的回答中的“猜测”让我怀疑。是您回答中的笑脸并没有让您投反对票。但最后,你证明是对的(至少,在 jQuery 论坛上得到了一些人的支持——查看 forum.jquery.com/topic/…
    【解决方案2】:

    我花时间问'people who know'...没有堆栈溢出,因为没有显式递归:fadeInfadeOut...方法都只是在效果队列。这意味着keep_animating 函数不是在同一上下文中执行的。

    感谢dave methvin:

    您所描述的“递归” 实际上不是递归。 jQuery的 视觉效果在 setTimeout 上运行 计时器,所以回调函数不是 立即运行 递归。相反,回调运行 动画完成后 几个“步骤”,每个步骤都由一个 设置超时。

    【讨论】:

      【解决方案3】:

      您的解决方案将递归,并最终破坏堆栈 - 但您将有相当长的一段时间 - 取决于浏览器 - 直到它完成。对于快速演示,这很好,但对于生产就绪代码,您需要采用非递归方法,例如:

      function pulse(){
         $("#id").fadeIn(500).fadeOut(500);
      }
      setInterval(pulse, 1000);
      

      有很多方法可以剥皮,但应该能让你到达那里。

      【讨论】:

        猜你喜欢
        • 2010-11-20
        • 2012-03-17
        • 2017-09-02
        • 2014-09-19
        • 2011-12-09
        • 2014-07-20
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        相关资源
        最近更新 更多