3

JavaScriptで文字列から自動で関数オブジェクトを作成したいのですが、パラメータに少し苦労しています。これまでにできることは次のとおりです。

var objectStr = "function(x) { return x; }";
var myFunc = Function("x", "{ return x; }");

関数が常に「関数(x)」で始まるという仮定を立てると、次のことができます。

var objectStr  = "function(x) { return x;}";
var funcBody = objectStr.replace("function(x)", "");
var myFunc = Function("x", funcBody);

これにより、自動アプローチに近づきます。文字列「x」を値に割り当て、それをパラメーターとして渡すこともできます。ただし、次のことを提供できる場所に行きたいと思っています。

var objectStr = "function(x, y) { return x*y; }";

この時点で、パラメーター x と y を文字列配列に抽出したいと思います。私はこれを正規表現でかなり賢明に行うことができると確信しています。

var parameters = [ "x", "y" ];

しかし問題は、パラメータの配列から複数のパラメータを持つ関数を作成するにはどうすればよいかということです。

編集

これを行う理由は、コールバック用の関数を生成するためです。これらのパラメーターの値を制御することはできません。説明する jQuery の例 (これは私が使用しているライブラリではありませんが) は次のようになります。

// Define myFunc using approach above
// then somewhere later in 3rd party code an itterator block
// like below will call:
jQuery(data).each(function() {
    myFunc(this);
}
4

3 に答える 3

3
var parsedParameters = ["x", "y"];
var parsedBody = "return x*y";
var func = Function.apply(null, parsedParameters.concat(parsedBody));
    /*function anonymous(x,y) {
        return x*y
    }*/

次の理由で機能します。

http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.1

15.3.1 関数として呼び出される関数コンストラクター

Function がコンストラクターとしてではなく関数として呼び出されると、新しい Function オブジェクトが作成されて初期化されます。したがって、関数呼び出し Function(…) は、同じ引数を持つオブジェクト作成式 new Function(…) と同等です。

したがって、 を使用する必要はなくnew、 を使用できるようになります.apply.apply配列からの引数で関数を呼び出すために使用されます。関数#適用を参照してください

.applyafter に渡される例の配列.concatは次のとおりです。

["x", "y", "return x*y"]

したがって、静的同等物はnew Function("x", "y", "return x*y")

于 2013-03-19T13:05:06.000 に答える
0

http://jsfiddle.net/tXe9T/などのeval を使用してみてください 。

var objectStr = "function(x) { alert (x); }";
var evalStr = "var myfunc = " + objectStr;
eval(evalStr);
myfunc("HI");
于 2013-03-19T13:06:56.737 に答える
-1

eval を使用して関数を評価できます。このような。

http://jsfiddle.net/sujesharukil/3Qpfx/

var funcMultipleParam = "function(x,y) {return x*y;}",
    FuncMultiple = eval("(" + funcMultipleParam + ")");

alert(FuncMultiple(10, 20));

それが役立つことを願っています。

スジ

于 2013-03-19T13:17:02.287 に答える