2016-12-03 8 views
0

evalを使用せずにjsオブジェクト式を評価するにはどうすればよいですか?例evalを使用せずにオブジェクト式を評価する

'd3.scale.category10().domain(d3.range(m))' 

'd3.range(n).map(function() {//body})' 

のために私はあなたが<script>要素を作成することができ

var a = d3.scale.category10().domain(d3.range(m)); 
+0

もう少し背景を教えてもらえますか?なぜこれらの 'd3'式を文字列として取得していますか?なぜあなたは 'eval()'を使ってみたくないのですか? Patrickの答えには、文字列式を評価する他の方法についてのヒントがいくつかありますが、実際には 'eval()'と同じことになります。では、ここで解決しようとしている実際の問題は何ですか? –

+0

私は異なったチャートを動的に作りたいと思っています。だから、文字列としてのすべてのd3式はjsonとしてサーバーからフェッチされ、クライアント側で評価したいと思います。私はちょうどその悪意のある性質と遅いコンパイル時間のためにevalの使用を避けたいです。しかし、私は知らない、それは安全なこの特定のsceneraioの評価を使用するだろうか? – user3929745

+0

クール。だからあなたは、ある形や別の形で 'eval()'を使うことになるでしょう。 Patrickはあなたが使うことができるいくつかの他のテクニックを共有しましたが、本質的には 'eval()'と同じことを行います。文字列をJavaScriptコードとして実行します。 ( 'Function'アプローチは、文字列を関数本体の中に入れます。これは1つの違いです)。これに' eval() 'を使うことについてのあなたの懸念は何ですか?あなたが心配している 'eval()'の考えられる問題を知っていれば、代替手段の検索を知らせることができます。 –

答えて

0

のような出力を取得し、textContentとして文字列を設定し、文書

var command = 'console.log("test")'; 
 
var s = document.createElement("script"); 
 
s.textContent = command; 
 
document.head.appendChild(s);
にscript要素を追加したいです

Function()に文字列を渡すこともできます。Function()は、その文字列を関数の本体として作成し、返された関数を実行します。あなたはそれが既に存在しなかった場合は、文字列にvar a =を付加しなければならないでしょう、あなたの特定のケースで

var body = 'console.log("test")'; 
 
var testFn = Function(body); 
 
testFn();

。また、Function()の方法を使用する場合は、その関数内で変数を使用する必要があります。varは、その関数だけにスコープを設定します。

+1

これはどちらも良い知っているテクニックですが、実際には 'eval()'とはまったく異なりますか?彼らは恐ろしい文字「e」、「v」、「a」、「l」を避けるかもしれませんが、彼らはほとんど同じことをしませんか?状況によっては、どちらかを 'eval()'よりも良い選択にする相違がある場合、そのことについていくつかの詳細を述べるとよいでしょう。 (基本的に、私はOPが 'eval()'を避けたいとは思っていません)。 –

+0

評価された式が後でスクリプトで使用したいオブジェクトを返すというケースがあります。たとえば、var a = 'd3.scale.category10()。domain(d3.range(m))';後で私はa.somemethod()を使いたいと思います。 – user3929745

関連する問題