【问题标题】:how to break a recursive callback function in javascript如何在javascript中打破递归回调函数
【发布时间】:2016-03-31 18:54:01
【问题描述】:

在这里,我传递了一个回调函数,该函数可以在运行时调用自身,并在每次调用时打印一个递增 1 的值。我希望它在某个值之后中断。我该怎么做?

我收到以下错误:

Uncaught SyntaxError: Unexpected token return

<html>
<body>
   <script>
       function main(callback) {
           callback(3);
       }

       main(function(val) {
           console.log(val);
           val > 50 ?    return false: return true;
           arguments.callee(val + 1);
       });
   </script>    
</body>
</html>

【问题讨论】:

  • 函数arguments.callee(val+1) 会被调用吗?您正在从上一行中的父函数返回。
  • 选择对您最有帮助的答案是一种礼貌

标签: javascript


【解决方案1】:

您不能在三元运算符中使用return。即使可以,您的递归也不会起作用,因为它总是会在 arguments.callee 执行之前返回。此外,不建议使用arguments.callee,因为它会在严格模式下抛出错误。

function main(callback) {
  callback(3);
}
main(function redo(val) {
  console.log(val);
  if (val > 50) return;
  redo(val + 1);
});

【讨论】:

    【解决方案2】:

    你的函数应该是这样的

    main(function(val) { console.log(val); if( val < 50 ) arguments.callee(val + 1); });

    来解决问题和错误

    val &gt; 50 ? return false: return true;

    这行代码是错误的,必须使用三元运算符给变量赋值,而不是像可执行块那样使用它。

    var flag = val &gt; 50 ? false: true;

    有效。

    【讨论】:

    • 不,只要值为 50 就会停止
    • 大声笑。是的,我在阅读 cmets 之前修复了它,即使那样它也不会是无限循环,因为我的条件 3 > 50 在第一次尝试时会失败,我的循环会停止
    • 对,删除了我的 cmets
    【解决方案3】:

    无论如何你都会回来的。

    相反,如果不满足终止条件,则需要继续递归调用。比如:

    function main(callback) {
      callback(3);
    }
    
    main(function(val) {
      console.log(val);
    
      // if condition is met, quit
      if (val > 50) {
        return;
      }
      
      // else do recursive call
      arguments.callee(val + 1);
      
    });

    如果你想保留三元运算符,你也可以这样做:

    val &gt; 50? false : arguments.callee(val + 1);

    【讨论】:

    • 谢谢,但是如果我做这样的事情 val>50?return:arguments.callee(val+1);也不工作
    • 在这种情况下,您可以使用val &gt; 50? false : arguments.callee(val + 1); - 在这种情况下,return 子句不能很好地与三元运算符配合使用
    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多