スムーススクロールを実装してみた

http://storehouse.sakura.ne.jp/sscroll.html

function sscroll() {
  var element = document.getElementById('foo');
  var duration = parseInt(document.getElementById('duration').value, 10)
  var interval = 10;
  var offset = 0;
  var length = element.scrollHeight - element.clientHeight
  var n = Math.ceil(duration / interval);

  function shift(x) {
    element.scrollTop = (0.5 - Math.cos(Math.PI * x / n) / 2) * length + offset;
  }

  (function(i) {
    if (i > n) {
      element.scrollTop = offset;
      return;
    }
    shift(i);
    var self = arguments.callee;
    setTimeout(function() { self(i + 1); }, interval);
  })(1);
}

再帰のせいで無駄に重い気がする…。
素直にsetInterval()を使えばよかったかな?