1

javascriptコードのように文字列を実行するにはどうすればよいですか?

//The user inputs javascript code and clicks run and it runs the javascript code

function getCode () {
    retrun code();
}

funciton runCode() {
    run(getCode());
}
4

5 に答える 5

4

欲しい機能はeval.

function funCode() {
    eval(getCode());
};
于 2013-05-20T22:54:54.367 に答える
3

eval()確かに機能しますが、コードを取得してコンストラクターに渡すという別のオプションもありますFunction。これにより、コードを関数本体として使用して新しい関数が作成されます。

これを行うと、いくつかの利点があります。

  • 変数のスコープはグローバル スコープになるため、実行するコードはローカル変数に干渉しません。
  • それははるかに優れたパフォーマンスを持っています
  • コードを厳密モードに強制し、識別子windowself識別子を隠して、グローバル変数の作成を困難にすることができます

funciton runCode() {
 // create `window` param---v         v--- and `self` param
    var f = new Function("window", "self", "  'use strict';  " + getCode())
                 // force strict mode -----------^
    var self = {}
    f.call(self, self, self); // pass an object to the `window` and `self` param
                              //   and set the same object as the `this` value
}

これは確かに完全なセキュリティを提供するわけではありませんが、コードを実行するための「サンドボックス」をもう少し提供できます。

self呼び出し後にオブジェクトを調べて、グローバルを作成しようとしたかどうかを確認することもできます。

try/catchコードまたは関数の実行を でラップし、スローされたエラーを調べることも役立つ場合があります。

于 2013-05-20T23:24:09.103 に答える
2

eval() は、探している関数です。

ただし、セキュリティ リスクを伴うため、賢明に使用するか、まったく使用しないでください。

var exec_string = 'alert(\'Hello, World!\')';
eval(exec_string);

「Hello, World!」を出力します。アラートで

于 2013-05-20T22:56:43.783 に答える
2

組み込みeval関数を使用できます:

function runCode() {
    eval(getCode());
}

この関数は少し「魔法」であることに注意してください。インタプリタは、周囲の字句コンテキストから情報を提供します。その結果、次のように呼び出す必要がありevalます。run = eval設定してから呼び出すことはできませんrun。(ただし、 と書くこともできますfunction run(s) { return eval(s); }。)

于 2013-05-20T22:55:36.290 に答える
1

他のポスターが示しているようevalに、この目的のために存在する方法です。ただし、eval有害であるかどうかに関係なく、すべての JavaScript コードを実行します (たとえば、サード パーティ ソースからの JavaScript には無限ループが発生するか、悪意のある動作が発生する可能性があります)。共通のリフレインがあります

eval == evil

そのため、eval は一般的にアンチパターンと見なされます。しかし、このような単純化したアプローチは間違っています。代わりに、評価したい文字列が信頼できる場合は、 eval を使用しても問題ありません。ただし、これが当てはまるケースは比較的少ないことがわかります。明らかに、サードパーティのサイトからのものはすべて危険です (所有者を信頼していても、ハッキングされている可能性があります)。自分のサーバーからでも、「中間者」攻撃の影響を受ける可能性がありますが、これはほとんどのサイトではほとんどありません.

JavaScript 文字列を評価する必要がある最も一般的な理由は、サード パーティの Web ページをレンダリングすることです。この場合、通常は、サーバー (例: http://phantomjs.org/ ) でページをレンダリングしてから、結果をブラウザーに送信することをお勧めします。こうすることで、ブラウザーは安全でないコードの実行から保護されます。

ますます一般的になっているもう 1 つのユース ケースは、ユーザーが入力したコードの結果を確認できるインタラクティブなチュートリアル Web サイトです。 /彼女は自分自身を入力しました。しかし、この場合でも、サイトの機能を壊してしまう間違い (無限ループなど) が心配なので、入力された JavaScript が何かを破壊しないように、(適切な保護手段を使用して) サーバーで評価を実行することをお勧めします。 .

evalこれらすべての問題を解決することを目的としたGoogle caja( https://code.google.com/p/google-caja/ ) の代替案が考えられますが、私は自分で使用したことがなく、その有用性についてコメントすることはできません。

于 2013-05-20T23:22:57.980 に答える