私は自分の関数の1つでコールバックを作る必要がありますが、プログラム全体が動作しているので、関数自体ではなく文字列の形でコールバック関数名を渡す必要があります。例えばJavascript:eval()を使用せずに文字列をコールバックとして使用する方法はありますか?
:要するに
function doThings(callback){
alert('hello');
eval(callback + '();');
}
function test(){
alert('world!');
}
var func = 'test';
doThings(func);
、私は動的に使用される機能変更しようとしている、と私は、コールバック関数ではなく、実際の関数の参照を表す文字列を使用しなければなりません。
私はevalが悪であることを覚えています - eval()
なしでこれを行う方法はありますか?
EDIT:オブジェクトの関数をあらかじめリストアウトする機能はありません。私はまた、この関数に個別の引数として配列を渡す必要があります。何らかの理由で.apply()
がうまくいっていません。window[callback]()
どの環境あなたはしていますか?ブラウザでは、doThings(window [func])、window ['test']()などがあり、親スコープオブジェクトから名前で関数にアクセスできます。 – DevDig
@DevDigブラウザーにあります。私はそれを試みたが、ウィンドウ[func]()。apply(null、args)を実行しても機能しません。私は先にそれを言及すべきだった。関数に個別の引数として配列を渡す必要もあります。 これで、すべての変数を英数字に制限している場合、eval()を使用することは必ずしも安全ではないですか?これは、SQLを生成し、入力をサニタイズするよりも、どのように安全性が低くなりますか? – geekman
ウィンドウ[func]()は、ウィンドウ[func] .apply(null、args)と同様にトリックを行う必要があります。悪い評価に関するいくつかの情報:https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/ – DevDig