0

evalを使わずにこのようなものを作ることは可能ですか?

foo1 = {"x": 4};
foo2 = {"x": "someFunc(foo1.x)"};

someFunc(var1)
{
    return (var1 + 1);
}

alert(foo1.x); // 4
alert(foo2.x); // 5 (hopefully)

実はこれには2つの問題があります。1 つ目は実行する関数を取得することで、2 つ目は括弧なしで実行することです。これは、ループでは foo2.x か foo2.x() かがわからないためです。

私が考えることができる最善の方法は、JSON オブジェクトで関数を表すキーワードを検索し、スイッチ リストを使用してそれらを実行し、キーワードを値に置き換えることです。

欠点は、何かが変更されるたびに JSON オブジェクトを更新する必要があることです。

4

3 に答える 3

1

JSONには組み込みの関数型はありません。

あなたのオプション:

  • 評価(これは悪です)
  • 関数をページにプリロードし(たとえば、オブジェクトのメソッドとして)、関数の名前をJSONで渡します。(その後、電話をかけることができますmyObject[function_name_as_string_from_json](foo, bar)
  • DSLとJSパーサーを作成します(関数が単純な方法で異なる場合)
于 2013-03-06T15:43:08.930 に答える
1

通常の JavaScript オブジェクトが必要なだけです。

var foo1 = {x: 4};
// we make foo2.x a function so it will dynamically update with foo1.x 's value
var foo2 = {x: function(){ 
    return someFunc(foo1.x);}
};

function someFunc(var1)
{
    return (var1 + 1);
}

alert(foo1.x); // 4
alert(foo2.x()); // 5

これらのオブジェクトを JSON として渡す必要がある場合はJSON.stringify、オブジェクトをサーバーに渡すために使用できます。

JSON は動的であることを意図したものではなく、データを渡すための言語です。操作中はデータをオブジェクトとして表す必要があり、送信する必要がある場合はいつでも JSON に変換できます。

于 2013-03-06T15:42:01.740 に答える
0

簡単な方法ではありません。それを行うアルゴリズムを想像してみてください。その場合、アルゴリズムがこのデータを区別する簡単な方法はありません。

foo1 = {"x": "someFunc(foo2.x)"};
foo2 = {"x": "someFunc(foo1.x)"};

function someFunc(var1) {
    return (var1 + 1);
}

この無限ループを止めるアルゴリズム、またはそれほど直接的でないアルゴリズムを考え出すのは困難です。

于 2013-03-06T15:44:29.913 に答える