現在時刻の取得について

Date関連の関数を使う

現在時刻や経過時間を取得したいときに、Date.now (IE8では、+new Date() を使用)を使います。
そのときに、関数内で使うと、以下のコードのように、返す値が変わってしまいます。

function f() {
  return Date.now();
}
var s = f();

for(var i=0;i<100000;++i) {}

s === f(); //false

base.jsを使う

そこで、base.jsでは、ofメソッドを使って、次のようにして値が変わらないようにします。

base("$b").of( {
  time: function() {
    return Date.now();
  },
  call: function() {
    return this.time;
  }
} );

var s = base("$b").call(); // ( 1 )最初に起動

for(var i=0;i<100000;++i) {}

s === base("$b").call(); //true

このときのthis.time プロパティは、(1)の「最初に起動」の際の現在時刻を取得しています。そのあとは、call メソッドを呼んでも、(1)のキャッシュを返します。

また、普通のメソッドを使いたいときには、mixメソッドを使うと良いかもしれません。

base("$b").mix( {
  getTime: function() {
    return Date.now();
  }
} ).of( /*...*/ );

二つの利点

これには、二つの利点があります。

  1. オブジェクトの責任がより明らかに
  2. 参照透過性が向上

今後の予定

SMILアニメーションのイベント駆動の実装に取り掛かります。