JS — объектно-ориентированный язык, причем, в хорошем смысле. Конечно, до концепции «все есть объект» ему далековато, но в целом, ок. Однако, в последнее время наметилась нездоровая тенденция: заметать объекты под ковер. Это одна из главных причин стиля callback-hell. Я решил понемногу исправлять ситуацию. Начал с таймаутов и прочих интервалов. Я вытащил данный объект наружу, запилив слой абстракции над его методами, и теперь таймауты можно писать в ООП-стиле
try{global}catch(e){global=window}
Waiting={
  clone: function(){return Object.create(this)},
  init: function(src){for(var i in src){if(!src.hasOwnProperty(i)) return this; this[i]=src[i]} return this},
  start: function(){this.id=global["set"+this.type](this.on.bind(this), this.pause)}, 
  clear: function(){global["clear"+this.type](this.id)},
  pause: 0
}
Timeout=Waiting.clone().init({type: "Timeout"})
Interval=Waiting.clone().init({type: "Interval"})
timeout=Timeout.clone().init({
 value: 1,
 on: function(){console.log(this.value)},
 pause: 3000
})
timeout.start() // just a simple test
interval=Interval.clone().init({
 value: 10,
 on: function(){console.log(this.value)},
 pause: 1000
})
timeout.on=function(){interval.clear()}
interval.start()
timeout.start()
// ::: 10
// ::: 10
// ::: 1