何度やっても忘れるので。
動作環境は Node.js 0.6.6 です。
作成 2011.12.23
更新 2011.12.25
更新 2011.12.25
Javascript の eval で文字列のスクリプトを取り込む
JSON の書式
基本的に Javascript と同様だが、キーを確実に文字列にする必要がある。
詳細は、RFC4627に記載。
詳細は、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も変更できたことがわかる。
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 で () を追加していない点に注意。
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 は独立して設定が可能。
変数の 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
タグ: Node.js
JavaScript