问题出在递归上。如果你那个不是递归的话,其实是防抖了的。  注意看上面红圈处的 `func.apply(context, args)`,这是个**同步方法** ,它执行的是什么?执行的你下面红圈处的递归,也就是又调用了一遍自身,又从头走了一遍箭头处的判断。 而此时下面黄圈处那句 `timeout = setTimeout(...)` 根本还没开始执行呢,所以 `notCalled` 始终成立,自然 `func.apply(context, args)` 会执行多次。