動的な可変個引数の指定をevalからapplyへ

2011-03-10
かなり古い記事です。現在も有効な内容であるかどうか分かりませんのでご注意ください。

やりたかったこと

Titaniumのデータベース処理の汎用ラッパークラスを作っていた時のこと。
where句を動的に組み立てるケースで、プレースホルダを使おうとすると引数の数が一定にならないのだけど、それをうまくdb.executeに渡したかった。

eval版

最初はevalを使った。

var sqlAndValues = ["select * from items where category_id = ? and status = ?", 1, 1];
var result = eval("db.execute(" + sqlAndValues.join(',') + ")");

JavaScript初心者の友eval。

apply版

それからしばらくしてapply使ったらきれいに書けるんじゃない?とひらめいた。

db.execute.apply = Function.prototype.apply;
var sqlAndValues = ["select * from items where category_id = ? and status = ?", 1, 1];
var result = db.execute.apply(db, sqlAndValues);

一行目はTitaniumのdb.execute.applyがundefinedと怒られたのでundefinedでなくしてやった。
なんでundefinedなのかは謎だが、これだけで解決できるJavaScriptってすごいな。

Profile

フルスタック気味のフリーランスプログラマー。

どちらかと言うと得意はインフラ構築とサーバーサイドプログラミングですが、フロントエンドもぼちぼちやっています。

最近の興味範囲はWordPress、AWS、サーバーレス、UIデザイン。

愛車はセロー。カメラはペンタックス。旅好きです。横浜在住。