0

私の目標は、テキストを入力として受け取り、そのテキストをコードとしてコンパイル/実行する JavaScript アプリケーションを作成することです。

たとえば、JS アプリケーションに、赤または緑に変わるライトがあるとします。ユーザーが入力したテキストはlightRed();、赤にlightGreen();することも緑にすることもできます。この種の問題を解決する標準的な方法は、 Jisonのように、ある種のレクサー/パーサーを実装することだと思います。

ただし、私は JS プログラミングにかなり慣れていないため、特に後で if/else ステートメントなどのより複雑な機能を追加することを計画している場合は、大変な作業のように思えます。したがって、入力されたテキストをJavaScriptとして処理することが可能かどうか疑問に思っていました。基本的にブラウザのJavaScriptを処理する機能を使用しています。したがって、JavaScript アプリケーションにはライトがあり、lightRed() および lightGreen() という関数があります。JavaScript に入力されたテキストは JavaScript として扱われるため、lightRed() をテキストとして記述すると、アプリケーションで lightRed() 関数が直接実行されます。これは可能ですか?これは、Jison のようなものを使用するよりも複雑でしょうか? ありがとう!

4

2 に答える 2

6

入力された JavaScript をコンパイルする最も簡単な方法は、eval 関数を使用することです。これは、文字列として渡されたコードを評価して実行します。

例:

eval(document.getElementById('code').value)

JSFiddle

ただし、これにより、ユーザーは必要なコードを制限なく実行できる可能性があることに注意してください。これを許可する前に慎重に検討してください。

セキュリティ リスクを軽減するために、この回答に示すようにグローバル スコープでコードを実行し、コードがローカル変数にアクセスできないようにすることができます。これは、ユーザーがブラウザーの開発者からコードを実行した場合と同じです。コンソール。

より安全な例:

(function(){eval.apply(this,[document.getElementById('code').value])})()

より安全な JSFiddle

于 2013-08-09T16:24:26.343 に答える
1

eval()文字列式を JavaScript として評価します。ほとんどの人 (私を含む) は、セキュリティ ホールについて警告します。しかし、考えてみれば、ユーザーは JavaScript コンソールを開いて、すべて同じコードを入力して実行することができます。

于 2013-08-09T16:25:17.517 に答える