2

私は現在、自己複製コードを実験しています。言語への愛情から、JavaScriptで書きたいと思います。

私は関数のコードを書くプログラムに取り組んでおり、それが次にその関数自身のコードなどを書きます。基本的に、必要なプロセスは次のとおりです。

  1. コード(ランダム性を含む)と数値(問題の提案された解決策)を返す関数を手動で作成します。
  2. この関数を何度も呼び出し、返された各関数の結果を評価し、実行しようとしていることに十分に適したコードが得られるまでプロセスを続行します。

今、私は常にevalがいかに悪であるか、どのようにそれを決して使用しないかなどを言われてきました。ただし、私の特定のユースケースでは、関数コンストラクターまたはevalがまさに私が探しているもののようです。

つまり、問題は次のとおりです。

eval / Functionコンストラクターは、私の場合に使用するのに本当に最適なツールですか?もしそうなら、実行されたコードのスコープを設定するために関数コンストラクターを使用すると思いましたが、グローバルスコープへのアクセスを本当に制限する方法はありますか?また、私の場合、evalを使用するためのいくつかの良い習慣は何ですか?

4

2 に答える 2

1

私は私が使用できる何かをちょうど理解したと思います:

node.jsを使用してJavaScriptコードを実行すると、vmモジュールを使用して、実行されたコードにローカルスコープまたはグローバルスコープへのアクセスを許可せずに、新しいコンテキストでJavaScriptコードを安全に実行できます。

vm.runInNewContextはコードをコンパイルし、サンドボックスで実行して結果を返します。実行中のコードはローカルスコープにアクセスできません。オブジェクトサンドボックスは、コードのグローバルオブジェクトとして使用されます。サンドボックスとファイル名はオプションです。ファイル名はスタックトレースでのみ使用されます。

ここで完全な例を見ることができます:vm.runInNewContext

これにより、コードを安全に評価できるようになり、現在利用可能な(私が見つけた)最も安全な方法のようです。これは、evalやFunctionコンストラクターの呼び出しよりもはるかに優れたソリューションだと思います。

助けてくれた皆さん、ありがとうございました。

于 2012-12-15T14:10:37.860 に答える
0

残念ながら、グローバルスコープへのアクセスを防ぐ方法はないと思います。たとえば、Web ブラウザーで次のようなコードを評価したとします。

(function(window) {
   eval(script);
)(null));

スクリプトが window にアクセスしようとすると、window が null であるため、エラーが発生します。ただし、自分が何をしているかを知っている人は、いつでもこれを行うことができます:

var global = (function() {
    return this;
}());

Crockford が「関数呼び出しスタイル」と呼ぶ方法で関数を呼び出すと、 this は常にグローバル変数にバインドされます。

于 2012-12-15T14:04:11.227 に答える