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 のまま。問題ありません。