2011-09-13 8 views
26

サーバーから渡されたカスタム関数を文字列として評価する必要があります。それはすべて私が手複雑なJSONの一部だが、とにかく、私は線に沿って何かを必要としているように見える:私は予想通りjs evalを使用して値を返すにはどうすればよいですか?

var customJSfromServer = "return 2+2+2;" 
var evalValue = eval(customJSfromServer); 
alert(evalValue) ;// should be "6"; 

は明らかにこれは動作しません。私はこれを達成できる方法は何ですか?

答えて

55

第1の方法はにありますreturnキーワードとセミコロン:

var expression = '2+2+2'; 
var result = eval('(' + expression + ')') 
alert(result); 

メモ'('')'は必須です。

またはあなたはそれ機能することができます:

var expression = 'return 2+2+2;' 
var result = eval('(function() {' + expression + '}())'); 
alert(result); 

さらに簡単、evalを使用しないでください:

var expression = 'return 2+2+2;'; 
var result = new Function(expression)(); 
alert(result); 
+0

ありがとうございます。あなたの2番目の例では、式の最後の行にコメントがあり、** unexpectedのようなエラーがある場合に 'eval( '(function()+' + expression + '}());')が失敗します入力の終わり**。これを修正するには、最後に改行を追加します: ''\ n}())''。 – gregn3

+0

解決していただきありがとうございます。私は最後に新しい行 '\ n}())'を付けて2番目の例を使用しました。 –

2

evalはこれをstatmentとして読み込み、値を返さないため、return文は使用しないでください。

var customJSfromServer = "2+2+2;" 
var evalValue = eval(customJSfromServer); 
alert(evalValue) ;// should be "6"; 

はこの作品http://www.w3schools.com/jsref/jsref_eval.asp

+0

これはおそらく、文字列の外側に' evalValue'を宣言しても動作します。 – Thilo

3
var customJSfromServer = "2+2+2;" 
var evalValue = eval(customJSfromServer); 
alert(evalValue) ;// should be "6"; 
2

を参照してください。

function answer() { 
    return 42; 
} 

var a = eval('answer()'); 
console.log(a); 

あなたは、関数の内部リターンをラップする必要があり、それはのevalに値を渡す必要があります。

6

あなたは常に存在しますreturn声明を保証することができれば、あなたが見つけるかもしれない、より適切な次:もちろん

var customJSfromServer = "return 2+2+2;" 
var asFunc = new Function(customJSfromServer); 
alert(asFunc()) ;// should be "6"; 

、あなたも行うことができます:

var customJSfromServer = "return 2+2+2;" 
var evalValue = (new Function(customJSfromServer)()); 
alert(evalValue) ;// should be "6"; 
1

は、 "2 + 2 + 2" を取得するには、サーバーの応答を変更します(「リターンを削除")これを試してみてください:

var myvar = eval(response); 
alert(myvar); 
関連する問題