18

関数とその内容を文字列として持っています。

var funcStr = "function() { alert('hello'); }";

ここで、実際にその関数を変数に取得するために eval() を実行します。

var func = eval(funcStr);

私の記憶が正しければ、Chrome と Opera では、単純に

func();

その関数が呼び出され、アラートが表示されました。

しかし、他のブラウザではそうではありませんでした。何も起こらなかった。

どちらが正しい方法であるかについての議論はしたくありませんが、どうすればこれを行うことができますか? variable(); を呼び出せるようにしたいです。その変数に格納されている関数を実行します。

4

11 に答える 11

33

これはどう?

var func = new Function('alert("hello");');

関数に引数を追加するには:

var func = new Function('what', 'alert("hello " + what);');
func('world'); // hello world

関数はオブジェクトであり、そのまま任意の変数に割り当てることができることに注意してください。

var func = function () { alert('hello'); };
var otherFunc = func;
func = 'funky!';

function executeSomething(something) {
    something();
}
executeSomething(otherFunc); // Alerts 'hello'
于 2009-08-13T12:01:09.853 に答える
15

IEはeval機能しません(おそらくセキュリティ上の理由で)。

最善の回避策は、次のように関数を配列に配置することです。

var func = eval('[' + funcStr + ']')[0];
于 2009-08-13T12:08:03.443 に答える
8

これは古いことだと思いますが、匿名の JavaScript 関数文字列を評価するために Google 検索で出てくる唯一の有効な結果でした。

私は最終的に、jquery google グループの投稿からその方法を見つけました。

eval("false||"+data)

data は、「function() { return 123; }」のような関数文字列です。

これまでのところ、これを IE8 と FF8 (私のパーソナル コンピューターのブラウザー) でしか試していませんが、jquery はこれを内部で使用しているので、ほぼどこでも動作するはずです。

于 2011-11-13T23:36:41.143 に答える
6

試す

var funcStr = "var func = function() { alert('hello'); }";

eval(funcStr);

func();
于 2009-08-13T11:57:23.390 に答える
4

次のように eval を使用します。

var func = eval('(' + funcStr + ')');
于 2009-08-13T11:58:09.643 に答える
3

文字列を実際の JavaScript 関数に変換する汎用関数パーサーを用意することで、この問題を解決しました。

if (typeof String.prototype.parseFunction != 'function') {
    String.prototype.parseFunction = function () {
        var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi;
        var match = funcReg.exec(this.replace(/\n/g, ' '));

        if(match) {
            return new Function(match[1].split(','), match[2]);
        }

        return null;
    };
}

使用例:

var func = 'function (a, b) { return a + b; }'.parseFunction();
alert(func(3,4));

func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction();
func();

ここにjsfiddleがあります

于 2014-11-13T20:40:39.270 に答える
0

また、機能するのは

var myFunc = function(myParam){
   // function body here
}
于 2009-08-13T19:39:49.027 に答える
0

関数を文字列として定義し、eval()それを ing し、すぐに関数を呼び出してパラメーターを渡す (そして結果をコンソールにダンプする) 簡単な例:

console.log('eval: %s', eval("(function(foo) { return foo.bar; })")({"bar": "12345"}));

これにより、次のような出力が生成されます。

eval: 12345

于 2013-07-02T00:49:48.267 に答える
0

eval() なしの EVAL...

function evalEx(code){
  var result,D=document,S=D.createElement('script'),
  H=D.head||D.getElementsByTagName['head'][0],
  param=Array.prototype.slice.call(arguments);
  code='function evalWE(){'+code+'}';
  S.innerText===''?S.innerText=code:S.textContent=code;
  H.appendChild(S);
  result=evalWE.apply(this,param);
  H.removeChild(S);
  return result
}

使用例:

ABC=evalEx('return "ABC"');
nine=evalEx('return arguments[1]+arguments[2]',4,5);
于 2012-03-01T01:43:53.713 に答える
-1

function-serialization-toolsは、関数の文字列表現を取り、それを関数として返す関数 s2f() を提供します。

于 2015-12-29T20:53:50.367 に答える