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

やりたかったこと

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ってすごいな。

次の記事

Rails3でTDD環境を整えたメモ