首页 文章

在javascript中,递归使用回调函数进行循环控制 - 这是危险的吗?

提问于
浏览
2

在下面的代码中不能在数组上使用 for 循环,因为每个步骤都是非阻塞的并且需要回调函数

操作原理:表单提交调用 verify() ,其中 el 是HTMLFormElement, nextFunc 是回调函数 . 表单中包含的每个元素都使用 verifyCol() 进行验证,在返回的第一个错误中突破为 nextFunc(err) ,或者在完成时突破到 nextFunc() .

// verify as called from post
Post.prototype.verify = function( el, nextFunc ) {
        var post = this;     
        var arr = this.entryArr(el);
        (function verifyOne( i ) {
                if( i >= arr.length ) nextFunc();
                else post.colVerify( arr[i], function(err) {
                        if( err ) nextFunc( err );
                        else verifyOne( i+1 );
                } );    
        })(0);          
}

这种方法对我来说很有意义(尽管可疑看起来像Lisp) .

这是正确的范例吗?递归调用回调函数是否有任何危险?

1 回答

  • 2

    JavaScript is a lisp variant(来自scheme的后代),这就是它看起来像lisp的原因 .

    如果 post 函数是来自HTTP请求的回调函数,则上面的代码中没有递归(在最严格的递归定义中) - 函数只是句柄,它们作为引用保存,并在HTTP发布时通过事件队列调用返回数据 .

    递归是否可以在JavaScript中用于循环递归取决于JavaScript解释器实现了什么tail-call-optimization但是大多数JavaScript实现(如果你知道的话添加一个注释)没有实现,所以通常循环递归(即调用函数)如果调用堆栈变得太深,可能会导致问题,而不会将调用放在事件队列上 .

    在您的情况下,从上一次调用返回帖子之前,从不调用verifyOne调用,因此您的循环通过事件队列

    程序范例看起来很好,对我来说就像教科书一样 .

相关问题