2009-08-13 17 views
16

私は関数とその内容を文字列として持っています。JavaScriptを使用して作成された匿名関数eval()

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

は今、私は実際に変数にその関数を取得するためにeval()を行います。

var func = eval(funcStr); 

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

func(); 

を呼び出すと、その関数を呼び出し、警告が表示されました。

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

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

+0

名前付き関数を単に持つのではなく、文字列リテラルとして表される無名関数がなぜ必要なのでしょうか? –

+0

FYI:私は自分のWebアプリケーションのための自分のスクリプトを定義しています。私はインタプリタを作成しており、その場でJS関数を構築してから実際に実行可能な関数を作成する必要があります。 –

+0

伝統的な方法で通訳を書いてみませんか? – Breton

答えて

30

どのように?

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' 
+0

これは、それを行うエレガントな方法であり、すべてのブラウザで動作します。ありがとう:) –

6

このようにevalを使用し

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

eval(funcStr); 

func(); 
+0

ねえ、ありがとうございました!しかし、そうするには少し奇妙に見えます:D。 –

4

を試してみてください。これについて

var func = eval('(' + funcStr + ')'); 
+0

これは私が当初考えていたものですが、私はオブジェクトにのみ当てはまると確信しています。 – karim79

+0

また、正しい方法であろうと間違った方法であろうと、IEでは動作しません。 –

+0

関数もオブジェクトです。かっこで動作します。 – Blixt

13

IEはできないeval機能(恐らくセキュリティ上の理由から)。

最適な回避策は、このように、配列内の関数を置くことです:

も働く何
var func = eval('[' + funcStr + ']')[0]; 
+1

こんにちは...卑劣な卑劣な! – Blixt

+0

はいできます。しかし、関数リテラルはステートメントではないので、それらの周りにかっこが必要です。配列解よりもきれいです。 –

+1

@Juan:間違っています。できない。 – SLaks

0

は、私はこれが古い実現

var myFunc = function(myParam){ 
    // function body here 
} 
7

であるが、それが唯一の有効な結果でした匿名のjavascript関数の文字列を評価するために私のGoogleの検索で出てくる。

私は最終的にjquery googleグループの投稿からそれを行う方法を考え出しました。データは以下のようにあなたのファンクション文字列をある

eval("false||"+data) 

「機能(){123を返す;}」

これまでのところ、私は、IE8とFF8(私の個人的なコンピュータ上のブラウザ)でこれを試してみましたが、私はjqueryがこれを内部的に使うと信じているので、どこでもうまくいくはずです。

+0

私は誰もがこの問題を抱えていないように見える理由を理解できません。これは金です、ありがとう! – Shwouchk

0

評価なしの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); 
+0

haha​​、GoogleパッケージアプリケーションがHTMLのインラインJavaScriptを許可しない理由を教えてくれました:http://developer.chrome.com/extensions/contentSecurityPolicy.html – nraynaud

0

eval()がそれをINGの、文字列としての機能を定義し、直ちに機能を呼び出す(その後に結果をダンプしながらパラメータを渡すの簡単な例コンソール):

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

これは、次のような出力を生成します。

eval: 12345

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(); 

here

関連する問題