new Function
eval以外の方法はありますか?
Function
コンストラクタで動的に引数名、変数名を定義することは可能です。
JavaScript
1new Function("a", "b", "c", "var x = a+b+c; return x;")(1,2,3); // 6
ただし、evalはStrict Modeでローカル変数を制限不可能になり、new Function
も関数スコープに限定されます。
グローバル変数
グローバル変数は「グローバルオブジェクトのプロパティ」として定義される為、プロパティ名を動的指定することで、グローバル変数を動的生成は可能です。
が、グローバル変数は名前衝突のリスクがある為、お勧めしません。
HTML
1<script>
2'use strict';
3this.a = 1;
4this.b = 2;
5this.c = 3;
6
7console.log(a, b, c); // 1 2 3
8</script>
keyを動的指定する
JavaScript
1for (var i = 0; i < 10; i++) {
2 eval("var num" + i + "=" + i + ";");
3}
こういう使い方をするなら、下記のプロパティ(キー)を動的に変更するコードが好ましいと感じます。
JavaScript
1var o = {}, a = [], m = new Map;
2
3for (var i = 0; i < 10; ++i) {
4 o[i] = i, a[i] = i, m.set(i, i);
5}
6
7console.log(JSON.stringify(o)); // {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
8console.log(JSON.stringify(a)); // [0,1,2,3,4,5,6,7,8,9]
9console.log(JSON.stringify([...m])); // [[0,0],[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9]]
以下、参考情報。
Re: hase_ さん