9

最近、既存のnode.jsプロジェクトにファイルをインポートしようとしました。私はこれがモジュールで書かれるべきであることを知っています、しかし私はこのように私の外部のjavascriptファイルを含めます:

 eval(fs.readFileSync('public/templates/simple.js')+'')

simple.jsの内容は次のようになります。

if (typeof examples == 'undefined') { var examples = {}; }
if (typeof examples.simple == 'undefined') { examples.simple = {}; }


examples.simple.helloWorld = function(opt_data, opt_sb) {
 var output = opt_sb || new soy.StringBuilder();
 output.append('Hello world!');
 return opt_sb ? '' : output.toString();
};

(はい、グーグルクロージャーテンプレート)。

これで、次を使用してテンプレートファイルを呼び出すことができます。

examples.simple.helloWorld();

すべてが期待どおりに機能しています。ただし、これらの関数のスコープが何であるか、およびexamplesオブジェクトにアクセスできる可能性がある場所を理解することはできません。

すべてがnode.js0.8サーバーで実行されており、私が言ったように、その動作は...理由がよくわかりません。

説明してくれてありがとう。

4

1 に答える 1

13

eval()呼び出した場所のローカルスコープに変数を入れます。

eval()が文字列引数のコードに置き換えられたかのようです。

ファイルの内容を次のように変更することをお勧めします。

(function() {
    ...
    return examples;
})();

そうすれば、次のように言えます。

var result = eval(file);

そして、すべてがどこにある/どこに行き着くかは明らかです。

注:eval()は大きなセキュリティ リスクです。信頼できるソースからのみ読み取るようにしてください。

于 2012-10-16T14:59:24.150 に答える