2010-11-23 14 views
0

javascriptを使用して動的生成フォームを作成したい場合、配列をパラメータとして渡すまで、私がこれをすると、エラーが発生します。 Coulr誰がこれが何であるか説明していますか?JS:パラメータとして配列を渡そうとしているときに関数でevalを使用していますが、エラーがスローされます

HERESに私のコード:

var loadFrm = function(component) { 
    for(nItem in component) { 
     var myComponent = "add" + firstToUpper(component[nItem].type); 
    var callComponent = myComponent + "(" + component[nItem].opt + ");"; 
    eval(callComponent); 
    } 
} 

var json = [ 
    { 
     type: "scale", 
     opt: {content: [{label: "male", value: "m"}, {label: "female", value: "f"}]} 
    } 
]; 

loadFrm(json); 

編集はここでエラーです:

missing ] after element list 
[Break on this error] addScale([object Object]); 

答えて

4

あなたは、文字列callComponentを見て、デバッガを使用している場合、あなたはおそらく、それはのようになります見つけることができますこれは:

addScale([object Object])

..それはあなたが望むものではありません。これは、optオブジェクトで効果的にtoStringと呼び出しているためです。オブジェクトのデフォルトのtoStringはそのように見えます。 evalのエラーは、無効な構文であるためです。

一般的に言えば、evalを使用する必要があると思われるときは、ほとんど確実に良い答えがあります。この場合、関数を呼び出してoptを渡そうとしているようです。

  1. あなたreally know what you're doingない限り、配列をループにfor..inを使用しないでください:上記の注意事項は

    var loadFrm = function(component) { 
        var nItem, functionName; 
    
        for (nItem = 0; nItem < component.length; ++nItem) { 
         functionName = "add" + firstToUpper(component[nItem].type); 
         window[functionName](component[nItem].opt); 
        } 
    } 
    

    Live example

    :これらの関数は、「グローバル」と仮定すると、あなたはこのようにそれを行うことができます。 for..inは、配列のインデックスを列挙しません。オブジェクトのプロパティを列挙します。

  2. window[functionName]を使用して関数を名前でルックアップします。これは、「グローバル」は実際にはwindowオブジェクトのプロパティであり、ブラケット付き表記を使用して文字列名を使用してプロパティをルックアップできるためです。
  3. window[functionName]で関数を取得した場合は、文字列型ではなくオブジェクトoptを渡して直接呼び出します。私はaddScaleがオブジェクトを見ることを期待していると仮定します。
  4. varのすべてを関数の先頭に移動しました。実際には(details)の位置にあるからです。
  5. 可能であれば、windowに置くのではなく、addScaleと関連する機能を自分のオブジェクトに移動することをおすすめします。 window名前空間はすでにかなり混雑しています。 Here's the live exampleは、windowにシンボルをまったく追加しない代わりに、addScale関数をfunctionsというオブジェクトに置き換えてそこから使用するように修正しました。オフトピック

:構文var loadFrm = function(component)は、それがその後、変数に代入する無名関数を作成します。これは多くの場合に使用されますが、条件に基づいて異なる機能を作成している場合を除きます(例::

var f; 
if (...) { 
    f = function() { ... }; 
} 
else { 
    f = function() { ... }; 
} 

...実際には役に立ちません。 (のような条件で異なる機能を作成している場合は、有用であるだけでなく、必要です)。recommend using named functionsという名前の関数は、関数名が誤って表示されて助けてくれるので、メッセージ、コールスタックなど

オフトピック2:あなたはjsonという変数を持っていますが、FYI、それはJSON表記を使用していません。 JSONのスーパーセットであるJavaScript配列とオブジェクトリテラル表記の組み合わせを使用しています。あなたはこれについて混乱している多くの人を見るでしょう、あなたはあなたが新しいと言っているので、それを言います。 :-) JSONは純粋に表記法です。 (非常に便利な1。)

+0

感謝。可能な解決策のデモコードを書くことができますか?私は初心者ですが、私はJSのソリューションの大きなビジョンを持っていません。 –

+0

@Nort:解決策のコードは*です。ライブサンプルを1秒間一緒に投げます。 –

+0

おかげさまで、あなたが書いたことはとても役に立ちます:) –

-1

使用この:提案のための

fn = eval(functionName); 
fn(objParameter) 
+0

答えを説明してください。 – Popo

+0

これをお読みになり、丁寧に回答してください。http://stackoverflow.com/help/how-to-answer –