JQuery递归函数?

Ric*_*nop 7 javascript jquery

如何从函数内部调用函数,使其变为递归?这是我的代码,我添加了一个注释,我想开始递归:

$('a.previous-photos, a.next-photos').click(function() {
    var id = $('#media-photo img').attr('id');
    var href = $(this).attr('href');
    href = href.split('/');
    var p = href[href.length - 1];
    var url = '/view/album-photos/id/' + id + '/p/' + p;

    $.get(url, function(data) {
        $('.box-content2').replaceWith('<div class="box-content2"' + data + '</div>');
    });

    // here I want to call the function again

    return false;
});
Run Code Online (Sandbox Code Playgroud)

jim*_*imr 9

您可以通过执行对匿名函数的递归调用

arguments.callee( .... );
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见此处


All*_*ver 5

最佳答案已过时。目前(2012 年 8 月)至少在 Firefox 中不推荐使用 callee。使用 callee 已过时。目前(2012 年 8 月)被调用者是“...... ECMA-262 不推荐使用。”(见讨论

您遇到了两个问题:

  1. 函数处理程序将只传递事件对象。
  2. 该函数未命名,因此您不能引用它进行递归

解决方案2:

这是两者中更容易的。通常使用匿名函数的原因是为了保持命名空间干净。括号定义了一个本地命名空间,因此在为函数命名后,括号外将无法访问它。以下内容对您有用:

$('.someclass').onClick( function dosomething(){
    ... your code ...
    dosomething() //again
});
dosomething() // will cause scope error, function not defined
Run Code Online (Sandbox Code Playgroud)

解决方案1:

这有点困难。由于传递给函数的唯一内容是事件对象,因此您需要扩展它以传递值。幸运的是,事实证明 jQuery 有一个专门用于此的系统!

$('.someclass').on( 'click', {myvar: 0}, function dosomething(event){
    ... your code ...
    event.data.myvar = event.data.myvar + 1;
    dosomething(event) //again
});
Run Code Online (Sandbox Code Playgroud)

注意:这对于必须附加和分离处理程序以防止无限循环(如 DOMSubtreeModified)时特别有用。

$('.someclass').on( 'DOMSubtreeModified.mynamespace', {myvar: 0}, function myfunc( event ){
    $(this).off( 'DOMSubtreeModified.mynamespace' );
    ... Some Code that changes .someclass subtree ...
    event.data.myvar = event.data.myvar + 1;
    $(this).on( 'DOMSubtreeModified.mynamespace', {myvar: event.data.myvar}, myfunc );
});
Run Code Online (Sandbox Code Playgroud)