作成 2011.12.23
更新 2011.12.25
Javascript の eval で文字列のスクリプトを取り込む
何度やっても忘れるので。
動作環境は Node.js 0.6.6 です。
JSON の書式
基本的に Javascript と同様だが、キーを確実に文字列にする必要がある。
詳細は、RFC4627に記載。
{"p1":"a", "p2":"b", "p3":123}
["abc1","def2","ghi3"]
コード1
eval を実行する際に () で囲むのは、ラベル誤検知を防ぎ、ハッシュとして確実に認識させるため。
var s = '{"p1":"a","p2":"b","p3":123}';
var o = eval('('+s+')');
console.log(o);
console.log(o.p1);
console.log(o.p2);
console.log(o.p3);
実行結果
{ p1: 'a', p2: 'b', p3: 123 }
a
b
123
コード2
ハッシュ値に function が入れられる。
function 実行中に変数bも変更できたことがわかる。
var a = '{"get":function(){b=100;return 2;}}';
var b = 1;
var o = eval('('+a+')');
console.log('b='+b);
console.log('o.get()='+o.get());
console.log('b='+b);
実行結果
b=1
o.get()=2
b=100
コード3
普通に Javascript コードが実行できる。
eval 内で宣言した変数も eval 外で使用可能。
JSON 関係のセキュリティ ホールはこのへんから発生する。
eval で () を追加していない点に注意。
var a = 1;
var s = 'var b = 2; b += a;';
eval(s);
console.log(b);
実行結果
3
コード4
クラス風な使い方ができる。
変数の o.t と p.t は独立して設定が可能。
var a = '{"t":1,"get":function(){return this.t;},"put":function(i){this.t=i;}}';
var o = eval('('+a+')');
var p = eval('('+a+')');
console.log('o.get()='+o.get());
o.put(2);
p.put(3);
console.log('o.get()='+o.get());
console.log('p.get()='+p.get());
実行結果
o.get()=1
o.get()=2
p.get()=3

©2004-2017 UPKEN IPv4