目的:避免 setInterval 因执行时间导致的间隔执行时间不一致。

arguments.callee

setTimeout(function () {
  console.log(new Date())
  setTimeout(arguments.callee, 1000)
}, 0)

注意argument 已经从 Web 标准中删除,并且在严格模式('use strict')下,不能使用 arguments.callee

递归 + setTimeout()

function infinite() {
  console.log(new Date())
  return setTimeout(infinite, 1000)
}

infinite()