8

私が望むのは、関数の名前を文字列として渡し、関数への参照を渡したようにすることです。たとえば、私はこれを作りたいです:

var test = function(fn){
  fn();
}
test(alert);

これに等しい:

var test = function(function_as_string){
    //...code that converts function_as_string to function reference fn
    fn();
}
test('alert');

これどうやってするの?

4

5 に答える 5

4

window オブジェクトから関数参照を取得します。

var fn = window[function_as_string];

デモ: http://jsfiddle.net/Guffa/nA6gU/

于 2012-09-15T23:57:43.757 に答える
2

eval を使用して関数への参照を取得します -

var Namespace = {
    quack: function () {console.log('quack!')}
};

function test (fnName) {
    var fn = eval(fnName);
    fn();
}
test('Namespace.quack')

これにより、必要に応じて他の引数を渡すことができる可能性があります。

ああ、window[fnName] を単純に使用できない理由は、それが $.ajax のようなものである場合です - window['$.ajax'] は undefined.. を返します。別の名前空間にあるかどうかを調べるには、 eval が最善の策です。

于 2012-09-16T00:03:07.433 に答える
1

関数を見てみeval()ましょう。JavaScript として評価される文字列を指定できます。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/eval

var test = function(fn){
  eval(fn + "()");
}
test(alert);

MDN からの評価に関する注意事項:

eval() は、渡されたコードを呼び出し元の権限で実行する危険な関数です。悪意のあるパーティの影響を受ける可能性のある文字列を指定して eval() を実行すると、Web ページ / 拡張機能のアクセス許可を使用して、ユーザーのマシンで悪意のあるコードが実行される可能性があります。さらに重要なことに、サード パーティのコードは、eval() が呼び出されたスコープを確認できるため、同様の関数が影響を受けない方法で攻撃を受ける可能性があります。

また、eval() は一般に、JS インタープリターを呼び出す必要があるため、代替手段よりも遅くなりますが、他の多くの構成要素は最新の JS エンジンによって最適化されています。

一般的なユースケースには、eval() の安全な (そして高速な!) 代替手段があります。

ここを見てください: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/eval

于 2012-09-15T23:58:06.847 に答える
1

関数はオブジェクトのプロパティです。他のプロパティと同じようにそれらにアクセスし、() を使用してそれらを実行できます。

​var o = {};
​​​​
o.b = function b() {
    alert("b");
}

o.b();

o["b"]();

グローバル関数の場合は、ウィンドウのプロパティです。

function a() {
    alert("a");
}

a();

window.a();

window["a"]();

ネストされた質問に関しては、後でアクセスできるオブジェクトにプロパティとして割り当てるのが最善の方法です。例えば:

function assignInside() {
    o.inside = function() {
        alert("inside");
    }
}

assignInside();
o["inside"]();

ここではすべてjsfiddleです。

PS、この場合に eval を使用する理由はなく、一般的に eval を避けるべき多くの正当な理由があります。

于 2012-09-16T00:02:50.740 に答える
0

どうですか:

var fn = new Function(function_as_string)
于 2012-09-16T00:19:38.807 に答える