jQueryをカリー化するスクリプトCurryQuery
JavaScript を勉強していると、
JavaScript でカリー化をする試みがよく書籍などで紹介されています。たとえば、与えた引数を単純に足していく関数
f があったとして、通常だと
f(1, 2, 3) のように引数を一度に渡すわけですが、カリー化された関数では
c(1) のように始めの引数か、一部の引数を渡すことになります。ただ、この段階では返り値が数値ではなく関数として返ってくるため、不完全な状態です。この返ってきた関数を別の変数(仮に
ff とする)に入れておき、次の引数を渡します。
ff(2) 。最後にさらに返ってきた関数を
fff として
fff(3) を実行するとようやく数値の結果(6)が返る仕組みです。
しかし、このカリー化。いったいどういう使い道があるのだろうか。
JavaScript でカリー化を実現しようとすると、スコープやクロージャーを駆使することになるので、どちらかというとそれらの方が利用価値が高かったりする。数学に興味のない人間(私を含めて)にとっては、「ふーん、そういうのもあるんだ」で終わってしまいそうな技術であります。
そこで、この技術を無理やり何かに応用しようと考え、
jQuery をたたき台にしてスクリプトを作ってみることにしました。
CurryQuery と名づけ、コードはわずか30行足らずです。
CurryQuery.js (プラグインではないですが、動作に
jQuery が必要です)
ソースコードをダウンロードするときは
こちら から
var CurryQuery = function (element) {
var original = $(element),
slice = Array.prototype.slice,
current;
return recursive;
function recursive(method) {
var arg = slice.call(arguments, 1);
if (typeof method === 'undefined') {
return recursive;
}
if (typeof current !== 'undefined') {
current = current[method].apply(current, arg);
} else {
current = original[method].apply(original, arg);
}
return recursive;
};
};
これは使い方、というか書き換え方です。
jQuery の書き方が次のようになります。
//従来の書き方
$('#hoge').css({backgroundColor: '#F00', left: 0, width: 200}).animate({left: 300, width: 50}, 2000);
//CurryQueryの書き方
CurryQuery('#hoge')('css', {backgroundColor: '#F00', left: 0, width: 200})('animate', {left: 300, width: 50}, 2000);
この例ですと短いので分かりにくいですが、長大なメソッドチェーンのコードを書く場合などは、
CurryQuery を用いた方がコードの見通しがよくなるような気がします。ただ、本当にカリー化を使っているのかと言われると少し怪しいですが。。。
//カリー化してるっぽい書き方
CurryQuery('#hoge')('css', {backgroundColor: '#F00', left: 0, width: 200})('animate', {left: 300, width: 50}, 2000)
('hide', 500)('show', 500)
('hide', 500)('show', 500)
('animate', {left: 0, width: 200}, 1000)('hide', 500);
このスクリプトは次のような人に向いています
・なんちゃってカリー化に興味がある人
・
jQuery のメソッドチェーンを多用しているが、行頭に現れる
ドッドが気持ち悪い 、
どうにも気持ち悪くてたまらない 、でも行末のドットは
さらに気持ち悪い と感じている人
・
CurryQuery(‘#hoge’)()()()()()()()()()()()()(‘hide’, 1000); みたいな意味不明なコードを書いて人々を驚かせたい人
-
JavaScript/Ajax JavaScript , jQuery , カリー化
関連記事
<お知らせ> 先月公開したjQueryプラグインClickable Canvas …
別のサイトで過去に作ったやつですが、ウィザードリィ風の3Dダンジョン・エディタの …
オンラインでもっとも利用される地図サービスGoogle Map。どちらかというと …
少なくともIE6では、オブジェクトや配列の最後の要素に”,̶ …
私はどちらかというとPrototype.jsライブラリをよく使ってきたのですが、 …
Ajax認証に続いてPHPで作る便利ツール第二弾です。今回はPHPのPEARライ …
「超多機能」JavaScriptフレームワークとして最近注目を集めるUIZE(ユ …
⇒マウスを動かすと、ページ上を漂流しているような感覚になるスクリプト 巷でもては …
追記:jQuery Mousehold.jsのリニューアルバージョンを公開しまし …
突然ですが約1年半ぶりにRPG制作を開始します。前回はというとシステム作りの段階 …