JavaScriptで関数名を文字列で与えるとその関数が実行されるような方法を考えます。
例
次のような例で考えます。
- 「orange」ならば「ミカン」と表示する関数を実行。
- 「apple」ならば「リンゴ」と表示する関数を実行。
ifで振り分ける
オーソドックスにifで処理を振り分ける方法です。
一つずつif節を書くので、関数が増えると長くなってしまいます。
var word="apple";
function orange(){
alert("ミカン");
}
function apple(){
alert("リンゴ");
}
if(word=="orange"){
orange();
}else if(word=="apple"){
apple();
}
function orange(){
alert("ミカン");
}
function apple(){
alert("リンゴ");
}
if(word=="orange"){
orange();
}else if(word=="apple"){
apple();
}
evalを使う
evalを使うと文字列があたかもコードを書いたかのように振る舞います。
これならば「eval(関数名+”()”)」とするだけで実行されます。
振り分ける必要がないので関数が増えてもコードが長くなりません。
また、既存の関数を書き換える必要がありません。
var word="apple";
function orange(){
alert("ミカン");
}
function apple(){
alert("リンゴ");
}
eval(word+"()");
function orange(){
alert("ミカン");
}
function apple(){
alert("リンゴ");
}
eval(word+"()");
オブジェクトとして使う
JavaScriptの指南本にはよく「evalを使うな」と書かれています。見通しが悪くなってデバッグしにくくなるからでしょう。
関数を配列(オブジェクト)のようにして作り、文字列を与えて実行する方法です。
これも関数が増えてもコードが長くなりません。
ただし、既存の関数が「function 関数名()」という形式で書かれている場合は、書き直す必要があります。
var word="apple";
var func_obj=[];
func_obj.orange=function(){
alert("ミカン");
}
func_obj.apple=function(){
alert("リンゴ");
}
func_obj[word]();
var func_obj=[];
func_obj.orange=function(){
alert("ミカン");
}
func_obj.apple=function(){
alert("リンゴ");
}
func_obj[word]();
コメント