[javascript][抜粋]Function.prototype.*

javascriptはFunction.prototypeに追加したメソッドで元の関数の挙動を変更することができる。

later

最速インターフェース研究会 :: Function.prototypeを拡張して遅延実行を実現する
関数の実行を指定時間後に行なう。

var func = function(v){alert(v)};

func.later(1000)("1秒後に警告");
func.later(2000)("2秒後に警告");
func.later(1000).later(2000)("3秒後に警告");

(function(v){alert(v);arguments.callee.later(1000)(v)}).later(1000)("1秒ごとに実行")

callTimeout, callInterval

Kazuho@Cybozu Labs: setTimeout をオブジェクト指向にしてみる

foo.bar.callTimeout(1000, foo, hoge);
foo.bar.applyTimeout(1000, foo, [ hoge ]); // これでも OK
foo.bar.callInterval(1000, foo, hoge); // setInterval 版
foo.bar.applyInterval(1000, foo, [ hoge ]); // setInterval & apply 版

laterに似ているが、時間に加えてself, 引数も拡張関数側で指定しています。また、setInterval版も。

later(cancel, complete, notify)

*「ふっかつのじゅもんがちがいます。」 - もっとエレガントにsetTimeoutをメソッド化する方法

function example(msg){
  alert(msg);
}

//〜〜〜

//遅延実行
var task = example.later(1000)('hello');

//〜〜〜

//キャンセル
task.cancel();

//〜〜〜

//まだ実行してなかったら、やっぱり即実行
if(!task.complete){
  task.notify();
}

ldrのlaterはキャンセル、キューイングされたまま未実行関数の任意タイミングでの実行可能。

asyncronous

IT戦記 - 関数を非同期化して汎用性を高める

putData.asynchronize()(function(result) {
  if (result == 'ok') {
    ....
  }
});

asynchronizeした関数終了時点で、処理実行。asynchronize対象処理と関係ない処理であれば、ブロッキングされずに処理を継続できる。

benchmark

nazonoDiary- 関数の実行時間を得る

testfunction = testfunction.bench("実行時間は"); //設定
testfunction(go); // 実行

重い処理の測定に。

defaults

parentNode.org ≫ Default Arguments in JavaScript Functions

var bar = function(a, b)
{
}.defaults('default_b');

bar();
// a = undefined, b = 'default_b'

bar(1);
// a = 1, b = 'default_b'

bar(1, 'some_value');
// a = 1, b = 'some_value'

javascriptはデフォルト引数を指定できないが、prototype拡張することで可能に。

cached

koyachiの日記 - Function.prototype.cached

function search(search_word, page_no) {
  //...
}
var cached_search = search.cached_by_arguments(2, 2);
result = cached_search("foo bar", 1);

同じ引数で過去に計算していれば、最後に計算した結果を参照。