jQuery函数递归 - 我迷失了这个

时间:2013-07-27 16:06:18

标签: javascript jquery recursion

我是jQuery的新手,我不明白为什么我在控制台日志中看到这个“if of end”行。如果toggleBox在“if of if”控制台日志行之前调用自身,那么console.log()函数是如何处理的?

似乎第1行和第2行只会重复,但不知何故,第3行正在运行。看起来它只是跳来跳去。在调用box.fadeToggle之前,toggleBox调用是否实际上会跳回到自身,完成if块,然后由于某种原因跳回到box.fadeToggle?

$(document).ready(function() {
var box     = $("#box");
var para = $("p");
var i   = 0;

para.text(i);

function toggleBox(i) {
    console.log($.now() + " 1. entering toggleBox. i=" + i);
    box.fadeToggle(2000, function() {
        console.log($.now() + " 2. after fade time. i=" + i);
        i++;
        if (i < 4) {
            para.text(i);
            toggleBox(i);
            console.log($.now() + " 3. end of if. i=" + i);
        };
    });
};

toggleBox(i);

});

控制台输出:

69387 1.输入toggleBox。 I = 0

71398 2.褪色后。 i = 0

71399 1.输入toggleBox。 i = 1

71400 3.如果结束。 i = 1

73396 2.褪色后。 I = 1

73397 1.输入toggleBox。 I = 2

73397 3. if的结尾。 I = 2

75398 2.褪色后。 I = 2

75399 1.进入toggleBox。 I = 3

75399 3.如果结束。 I = 3

77399 2.褪色后。 i = 3

1 个答案:

答案 0 :(得分:0)

box.fadeToggle(2000; function

启动fadeToggle并注册回调然后返回。这意味着toggleBox(i);会立即返回而不会更深入,因此执行以下console.log

你必须意识到这不是一个真正的递归,因为回调将在动画之后才被调用,从而让当前指令流继续。任何异步操作都会出现同样的现象。