0

この関数呼び出しを文字列として渡します:

var dcall = "tumbsNav(1)";

SQLのexecのようにこれを動的に実行することは可能ですか?

exec(dcall)
4

4 に答える 4

3

これを行うには、が必要ですeval(dcall)

evalプログラムにひどくセキュリティホールとパフォーマンスの問題を開く可能性があります。あなたがそれを使う必要があるならば、それは通常あなたがあなたのプログラムをうまく設計していないことを意味します。

代わりに、呼び出したい関数への参照を保持し、引数の配列を保持してapply、たとえば、を使用することができますtumbsNav.apply(null, [1]);。私はあなたのコードを知らないので、それが私が提供できる最も一般的な解決策です。

于 2012-05-24T00:32:39.893 に答える
3

evalは同等ですが、使用しないでください。

代わりに、次のような関数を渡します。

var dcall = function() {tumbsNav(1);};

次に、次のように呼び出します。

dcall();
于 2012-05-24T00:29:00.910 に答える
1

どこに保管しても

var dcall = "tumbsNav(1)";

代わりに保存できます

var dcall = function() {
   return tumbsNav(1);
};

電話をかける代わりに、どこに電話をかけても

eval(dcall);

代わりに電話することができます

dcall();

これが機能しない唯一のケースは、が呼び出さtumbsNavれたときに定義されていなかった場合です。var func = ...次に、文字列を保存する必要があります。文字列が完全に制御されている場合、セキュリティホールはありませんが、@Porcoが言及しているすべての問題に注意してください。

Kolinkが述べたように、私の例は、tumbsNavtumbsを呼び出すラップされた無名関数で割り当てられたときに定義されていなくても問題は発生しません。上記のコメントは、例が次の場合にのみ意味があります。

var dcall = tumbsNav, darg = 1;
// later in the code, you can call
dcall(darg) ;
于 2012-05-24T01:09:28.347 に答える
1

eval(dcall) を使用します。

他の人が言及したように、 eval は悪い習慣と見なされます。その主な理由は次のとおりです。

1) 不適切な使用により、コードがインジェクション攻撃に対して脆弱になる可能性があります。

2) コードの保守が難しくなる (行番号がない、デバッグ ツールを使用できない)

3) 実行速度が遅くなる (ブラウザがコンパイルできない)

4)スコープの予測が不可能になる。

ただし、これらすべてを理解していれば、eval は非常に役立ちます。

于 2012-05-24T00:43:21.127 に答える