0

我是 jQuery 新手,我不明白为什么我会在控制台日志中看到这个“if 结束”行。如果 toggleBox 在“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。我=0

71398 2. 褪色时间后。我=0

71399 1.进入toggleBox。我=1

71400 3. if 结束。我=1

73396 2. 褪色时间后。我=1

73397 1.进入toggleBox。我=2

73397 3. if 结束。我=2

75398 2. 褪色时间后。我=2

75399 1.进入toggleBox。我=3

75399 3. if 结束。我=3

77399 2. 褪色时间后。我=3

4

1 回答 1

0
box.fadeToggle(2000; function

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

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

于 2013-07-27T16:08:59.113 回答