0

関数を起動したいと思います。残念ながら、関数の名前は文字列として提供されるため、直接呼び出すことはできません。

例:

関数 myFunction() {
   alert('私は myFunction');
}
関数 anotherFunction() {
   alert('私は別の関数です');
}

var func_name = 'myFunction';

$obj = jQuery('a');

$obj.each(関数(){
   $(this).func_name(); // eval はここでは役に立たなかった :(
});

JS は func_name が有効な関数であると想定しているため、明らかにこれは機能しません。func_name() の代わりに myFunction() を起動する方法はありますか? ありがとう。

更新: 答えのいくつかをテストした後、問題の説明が完全ではないようです。:OI は、関数をアタッチ/実行するオブジェクトを含めるようにコードを更新しました。

再度、感謝します!

4

4 に答える 4

7

eval を使用する理由はありません。関数がグローバルの場合は、window[func_name]()

あなたの更新された質問で:

//the function $ returns an object, thus, this is changed
$(this).func_name();

//to this:
$(this)[func_name]();
于 2009-09-20T14:41:11.793 に答える
2

メソッドについては、使用します

obj[func_name]()

グローバルに宣言された関数はグローバル オブジェクトのプロパティであることを忘れないでください (つまりwindow、ブラウザー内)。

ローカル関数については、私が知る限り、回避策はありません

eval(func_name)()
于 2009-09-20T14:52:38.250 に答える
2

他の人が述べたように、これはプロパティ アクセサー演算子- "[" および "]" で行われます。この場合に重要なのは、この関数がどのように宣言され、どこから参照されているかです。

グローバルに宣言されている場合(つまり、関数宣言または関数式としてグローバル スコープ内で)、またはある時点でグローバル オブジェクトのプロパティに割り当てられている場合、グローバル オブジェクトのプロパティとしてアクセスできます。3番目に。ECMAScript-262 のエディションでは、次のような式でグローバル オブジェクトにアクセスできます。

(function(){ return this; })();
// or just `this` when in global scope

(ブラウザーでは、グローバル オブジェクトは通常、 global によって参照されるオブジェクトと同じであることに注意してくださいwindow。ただし、そうである必要はありません)。

したがって、次のようにグローバル関数にアクセスします。

var globalObj = (function(){ return this; })();
globalObj['your_func'];

// or via `window`
window['your_func'];

通常、関数がローカルで宣言されている場合、つまり別の関数本体で問題が発生します。

(function(){
  function your_func(){};
  // how to access `your_func` here?
});

この問題は基本的に、(前の例のように) グローバル オブジェクトにアクセスすることはできますが、関数の変数オブジェクト(つまり、関数コードで変数および関数宣言の「ベース」として使用されるオブジェクト) にアクセスすることはできないという事実によるものです。 .

そのような場合には確かevalに使用できますが、それは間違いなく問題に対する間違ったアプローチです。はるかに簡単で、互換性が高く、実行効率の高い方法は、関数をローカル オブジェクトのプロパティとしてアタッチすることです。

(function(){
  ...
  function your_func(){}
  var funcs = { your_func: your_func };
  ...
})();

次に、まったく同じ括弧を使用してプロパティにアクセスします – 問題のプロパティ参照関数:

funcs['your_func'];
于 2009-09-20T15:19:51.043 に答える
0
eval(func_name + "()");

Eval は文字列を受け取り、実行時に評価します。

于 2009-09-20T14:38:00.083 に答える