Hatena::ブログ(Diary)

たそがれ日記

2013-04-03

JS 形式の設定ファイルを読み込むときは eval の代わりに new Function を使う

なぜか?
それはスコープチェーンが継承されるのを防ぐため。

具体的な例を見てみましょう。
以下のような、設定ファイルがあったとします。

[ conf1.js ]

{
  val1: 'abc',
  val2: 2
}

これを読み込みます。

eval 版
var work = 1;
var data = fs.readFileSync('/path/to/conf');
var conf = eval('(' + data + ')');
new Function 版
var work = 1;
var data = fs.readFileSync('/path/to/conf');
var conf = new Function('return ' + data)();

上の場合、eval 版、new Function 版ともに同じ結果なので問題ありません。

しかし、次のような設定ファイルの場合

{
  val1: 'abc',
  val2: work=2
}

eval 版だと、読み出し後に変数 work が破壊されます。
一方、new Function 版はスコープチェーンが切れているので work は 1 のまま。問題ありません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/tasogarepg/20130403/1364996453
リンク元