2016-03-31 1 views
0

私はIIFEにいくつかのコードを持っています。私は、関数getValue()を持っています。この関数は、IIFE内で宣言されている変数の値を動的に返します。私はeval()を使用して、変数のデータ構造を再構成することなく、代わりのソリューションを探しています。動的な変数値を返すときにEval()を避ける

注 - 私はオブジェクト内に変数を入れないようにしようとしています(つまり、果物)。

(function() { 

    var apple = 'Apples!!', 
     banana = 'Bananas!!', 
     cucumber = 'Cucumbers!!'; 

    function getValue(key) { 
     return eval(key); //can I avoid using eval()? 
    } 

    console.log(getValue('apple')); //Apples!! 

})(); 
+1

最初に変数を使用しないでください。オブジェクトを使用して名前に値をマップします。 – Barmar

+0

@Barmar私の変数を別のオブジェクト(すなわち、果物)の中に入れることを意味しますか?私は自分の変数のデータ構造を変更しないようにしようとしています。 – Jon

+0

はい、そうです。あなたがしようとしていることは、単にそれを行うための間違った方法です。変数名はプログラマのためのものであり、アプリケーションデータの一部であってはならない。 – Barmar

答えて

4

これはいかがですか?

(function() { 
 

 
    var fruit = { 
 
     apple: 'Apples!!', 
 
     banana: 'Bananas!!', 
 
     cucumber: 'Cucumbers!!' 
 
    }; 
 

 
    function getValue(key) { 
 
     return fruit[key]; //can I avoid using eval()? 
 
    } 
 

 
    console.log(getValue('apple')); //Apples!! 
 

 
})();

+0

私の変数のデータ構造を避けたい。変数を果実に入れるのを避けることはできますか? – Jon

+0

@Jonこれは、JavaScriptであなたが求めていることを通常どおりに行う方法です。ハッシュを使用したくない特別な理由はありますか? –

+0

@Jon - プレーンなローカル変数に 'eval()'以外の文字列名でアクセスする方法はありません。 Javascriptは名前で直接アクセスするための他の方法をサポートしていません。だから、それらをプロパティ名でアクセスできるオブジェクトに入れるか、 'eval()'を使います。それらは選択肢です。 – jfriend00

1
(function() { 

    var fruit = { 
     apple: 'Apples!!', 
     banana: 'Bananas!!', 
     cucumber: 'Cucumbers!!'; 
    } 
    function getValue(key) { 
     return fruit[key]; //can I avoid using eval()? 
    } 

    console.log(getValue('apple')); //Apples!! 

})(); 
+0

私の変数のデータ構造を避けたい。変数を果実に入れるのを避けることはできますか? – Jon

+0

いいえ。この作品を制作するにはオブジェクトが必要です。あなたがオブジェクトを必要としない理由はありますか? – Wainage

1

あなたはすべての有効な変数名を列挙してコピーする場合、それが可能だ:

(function() { 

    var apple = 'Apples!!', 
     banana = 'Bananas!!', 
     cucumber = 'Cucumbers!!'; 

    function getValue(key) { 
     var vals = { apple: apple, banana: banana, cucumber: cucumber}; 
     return vals[ key]; 
    } 

    console.log(getValue('apple')); //Apples!! 

})(); 

あなたはまた、パラメータ値を検証することでevalの使用を消毒考えることができた:

(function() { 

    var apple = 'Apples!!', 
     banana = 'Bananas!!', 
     cucumber = 'Cucumbers!!'; 

    var publicVars = ["apple", "banana", "cucumber"]; 

    function getValue(key) { 
     if(publicVars.indexOf(key) < 0) 
      throw new Error("Invalid variable name for getValue: " + key); 
     return eval(key); 
    } 


    console.log(getValue('apple')); //Apples!! 

})(); 


脚注:上記の例は、プログラムメンテナンスのクライアントコストを最小限に抑えることを目的としています。提案された「果物」オブジェクトとは対照的に、それらを使用して新しいプロジェクトを設計することは提案されていません。

関連する問題