動的な可変個引数の指定を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ってすごいな。