現在時刻の取得について
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( /*...*/ );
二つの利点
これには、二つの利点があります。
- オブジェクトの責任がより明らかに
- 参照透過性が向上
今後の予定
SMILアニメーションのイベント駆動の実装に取り掛かります。