下のように変数nameに与えられた名前の関数を実行したいといった場合、
どうすればいいのでしょうか
javascript
1function registerFunction(name , response){ 2 name(response); 3} 4 5registerFunction(name , response);
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
普通に動きませんか?
それともnameを文字列で与えたいのでしょうか?
javascript
1function registerFunction(name,response){ 2 name(response); 3} 4function aaa(v){ 5 console.log("hoge"+v); 6} 7function bbb(v){ 8 console.log("fuga"+v); 9} 10registerFunction(aaa,"xxx"); 11registerFunction(bbb,"yyy"); 12
追記
リストにあるものだけ実行する
function registerFunction(name,response){ var mylist={"aaa":aaa,"bbb":bbb}; if(typeof mylist[name]!=="undefined"){ mylist[name](response); } } function aaa(v){ console.log("hoge"+v); } function bbb(v){ console.log("fuga"+v); } registerFunction("aaa","xxx"); registerFunction("bbb","yyy"); registerFunction("ccc","zzz");//cccはリストにないので実行されない
※こうすれば指定する文字列と実行する関数は必ずしも同じである必要はない
逆に必ず文字列名でユーザー関数を実行するなら配列に文字列を羅列し
合致した場合だけevalを実行するような保険をかけることはできます。
投稿2016/09/20 12:05
編集2016/09/20 12:30総合スコア114843
0
Function()
それがグローバル関数であれば、Function()
を利用することで実装可能です。
JavaScript
1function registerFunction(name , response){ 2 Function('return this')()[name](response); 3}
eval()
グローバル関数でなければ、eval
で実行可能ですが、原則として eval
は使わない方が良いと思います。
理由は下記スレッドで回答しました。
オブジェクトのプロパティ
関数名に変数を利用したい場合はオブジェクトのプロパティに関数を代入する方法が安全です。
JavaScript
1(function () { 2 var obj = {hoge: function (string) { console.log(string); }}, 3 name = 'hoge'; 4 5 obj[name]('foo'); // "foo" 6}());
Re: yuuhi さん
投稿2016/09/20 12:04
編集2016/09/20 12:08総合スコア18164
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
nameに渡される文字列と合致する関数が存在する前提で
javascipt
1eval(name + "(" + response + ")");
(追記)
安易に上記提案をしましたが、think49さんのおっしゃる通りだと思います
投稿2016/09/20 12:05
編集2016/09/20 12:08総合スコア3111
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/20 12:16
2016/09/20 12:28