この関数呼び出しを文字列として渡します:
var dcall = "tumbsNav(1)";
SQLのexecのようにこれを動的に実行することは可能ですか?
exec(dcall)
この関数呼び出しを文字列として渡します:
var dcall = "tumbsNav(1)";
SQLのexecのようにこれを動的に実行することは可能ですか?
exec(dcall)
これを行うには、が必要ですeval(dcall)
。
eval
プログラムにひどくセキュリティホールとパフォーマンスの問題を開く可能性があります。あなたがそれを使う必要があるならば、それは通常あなたがあなたのプログラムをうまく設計していないことを意味します。
代わりに、呼び出したい関数への参照を保持し、引数の配列を保持してapply
、たとえば、を使用することができますtumbsNav.apply(null, [1]);
。私はあなたのコードを知らないので、それが私が提供できる最も一般的な解決策です。
eval
は同等ですが、使用しないでください。
代わりに、次のような関数を渡します。
var dcall = function() {tumbsNav(1);};
次に、次のように呼び出します。
dcall();
どこに保管しても
var dcall = "tumbsNav(1)";
代わりに保存できます
var dcall = function() {
return tumbsNav(1);
};
電話をかける代わりに、どこに電話をかけても
eval(dcall);
代わりに電話することができます
dcall();
これが機能しない唯一のケースは、が呼び出さtumbsNav
れたときに定義されていなかった場合です。var func = ...
次に、文字列を保存する必要があります。文字列が完全に制御されている場合、セキュリティホールはありませんが、@Porcoが言及しているすべての問題に注意してください。
Kolinkが述べたように、私の例は、tumbsNav
tumbsを呼び出すラップされた無名関数で割り当てられたときに定義されていなくても問題は発生しません。上記のコメントは、例が次の場合にのみ意味があります。
var dcall = tumbsNav, darg = 1;
// later in the code, you can call
dcall(darg) ;
eval(dcall) を使用します。
他の人が言及したように、 eval は悪い習慣と見なされます。その主な理由は次のとおりです。
1) 不適切な使用により、コードがインジェクション攻撃に対して脆弱になる可能性があります。
2) コードの保守が難しくなる (行番号がない、デバッグ ツールを使用できない)
3) 実行速度が遅くなる (ブラウザがコンパイルできない)
4)スコープの予測が不可能になる。
ただし、これらすべてを理解していれば、eval は非常に役立ちます。