51

私はこれが初心者の質問かもしれないことを知っています、しかし私はそれの主な利点について興味があり eval() ます-それはどこで最もよく使われるでしょうか?情報をいただければ幸いです。

4

15 に答える 15

45

このeval関数が最もよく使用されます:決して。

文字列をJavascript式として評価することが目的です。例:

eval('x = 42');

多くの人が自分のやりたいことのために適切なコードを書く方法を知らなかったので、それは以前からたくさん使われていました。たとえば、フィールドに動的な名前を使用する場合:

eval('document.frm.'+frmName).value = text;

それを行う適切な方法は次のとおりです。

document.frm[frmName].value = text;

メソッドは文字列をコードとしてeval実行するため、文字列が使用されるたびに、誰かがページに有害なコードを挿入する可能性があります。クロスサイトスクリプティングを参照してください。

この関数の正当な使用法はいくつかありevalます。ただし、実際に必要になる状況になる可能性はほとんどありません。

于 2012-05-06T21:22:14.327 に答える
43

これはかなり古い質問であり、おそらく人々は当時のユースケースをeval()適切に考えていませんでした。の優れた用途の1つは、バックエンドまたはフロントエンドの開発フローにホットリロードeval()を実装することです。

基本的eval()に、エディターでコードを編集し、実行中のアプリケーションに、再起動せずに、また状態を失うことなく(実装に応じて)パッチを適用することができます。ファイルの変更を監視し、何らかの方法で変更をアプリケーションに送信する関連コードが必要になりますが、eval()最終的には、これらの変更を実際のjsに変換する方法です。

編集

私が遭遇した別のユースケース:

eval()トランスパイルしたくないファイル(jsonなど)を動的に要求するイベントで、webpackのコンパイルプロセスをバイパスするために使用できます。例:

const data = eval('require')(`./emails/${recipient}/${type}.json`)

その点で、私は、悪のようなステートメントを書くことは完全に間違っていると思いますeval()、または決して使用されるべきではありません。このような包括的な声明は本当の悪です!

于 2016-05-13T06:31:59.963 に答える
11

evaljavascriptコードの文字列を実行(または評価)することができます。

したがって、誰かにjavascriptコードの文字列を実行させたい場合に適用できます。たとえば、JavaScriptに関する教育記事の下で、読者はすぐに試すことができます:)

または、Webサイトがプログラマーを対象としている場合は、プログラマーに独自のプラグインを作成して実行してもらいたい場合があります。

于 2012-05-06T21:12:24.760 に答える
7

evalを使用する最良の目標は、コードを動的にロードし、実行時にコードを生成し、同様のメタプログラミングを行うことです。一般に、evalなしで同じことができる場合は、evalを使用しないでください。

于 2013-02-05T21:20:54.273 に答える
6

eval()Javascriptでは使用しないでください。

eval()以前はJSON文字列の解析に使用されていましたが、その使用はより高速でより安全なに置き換えられましたJSON.parse

于 2012-05-06T21:07:41.513 に答える
4

                  eval() = evil

実際にはまったく使用しないでください。簡単なコード挿入に使用できますが、誰かがを使用して不正なスクリプトを挿入する可能性がありますeval()。時々人々はeval()JSONを解析するために使用します

eval("obj." + id);   //newbies

しかし実際には、を使用せずにこれらすべてのことを達成できますeval()

obj[id];             //should-do
于 2012-05-06T21:10:30.980 に答える
3

Webページのフィールドの値に保存されているJSを実行できます。

あなたはJSでevalを使うことができます、それはあなたのコードが攻撃するのにより実行可能であるということだけです。AJAXを使用しない限り、サーバーの問題はありません。

evalを使用する場合は、文字[()<>{}]を解析する必要があります。

于 2012-05-06T21:08:18.223 に答える
1

前述のように、eval()の使用には潜在的なリスクが伴います。文字列を式として評価する場合は、ECMA-6で導入された${}を使用して式を評価できます。

于 2015-01-28T11:47:12.647 に答える
1

たぶん私は間違っていますが、テンプルファイルから文字列を解析するためにそれを使用しています:

const name = 'Daman'
const fileContent = 'Hello ${name}'
const result = eval('`' + fileContent + '`')

それは私に必要なものを与えてくれます:

"Hello Daman"
于 2016-09-15T15:03:53.137 に答える
0

evalを使用する最良のユースケースの1つは、ユーザーが実行時にjavascriptを実行できるjavascriptロガーです。たとえば、ユーザーがロガーウィンドウでスクリプトを実行できるようにするjavascriptロガー。

于 2014-04-12T04:11:55.833 に答える
0

javascriptコードを表す文字列に基づいてコードを動的に実行します。例えば:

let dynamicFunc = eval('(x)=>(x+2)') // or whatever plain text which is valid JS function
console.log(dynamicFunc(40));
// expected output: 42

セキュリティ警告!特にサーバー側で使用する場合は、悪意のあるスクリプトの実行を回避するために、これらの文字列を常に検証する必要があります。

于 2019-05-12T17:26:28.390 に答える
-1

クライアントスケルトンを構築し、それを基盤アプリとして機能させることができます-コードのバンドルを受け取り、それらを実行します-それによってクライアントを非常に柔軟にします-サーバー上のすべてのコードをバンドルにします。ただし、これは非常にリスクが高く、そのようなことが必要な場合は、JavaバンドルでJavaを使用する必要があります。Evalがまだその言語で使用されている理由については議論の余地がありますが、セキュリティ上のリスクが大きすぎて使用できません

于 2014-11-11T08:28:41.143 に答える
-1

evalを使用すると便利ですが、他のすべてと同様に、リスクを認識しておく必要があります。JSコードのすべての部分は潜在的なリスクです。ソフトウェアのバグは、意図しない結果を伴わずに論理エラーやコーディングエラーを介して忍び寄ります。私はいつも、コンピューターはあなたが望んでいることを決して行わない、あなたが彼らに指示したことを行うと言っています。つまり、ソフトウェアは慎重に検討する必要があることを覚えておく必要があります。ソフトウェアは変更されていません。人々は、注意深いアナラシスと適切な設計の代わりに、今でもオンザフライでコーディングしています。私たちは皆、ソフトウェア開発における同じ罪の罪を犯しています。evalを使用する-evalは悪ではなく、あなたが作るものです。

于 2019-05-04T11:55:25.657 に答える
-1

絶対とは絶対言うな。Evalには非常に優れた正当なユースケースがあります。これは単なる強力なツールであるため、使用方法に注意を払わないと、深刻な問題が発生する可能性があります。

Javascriptはクライアント側で実行されるため、セキュリティリスクはサーバーではなくクライアントにあります。javascriptでevalを使用し、入力のソースまたはeval関数へのその入力の内容を慎重に検証しない場合、クライアントに深刻な結果をもたらす可能性があります。

そうは言っても、私がjavascript evalを最大限に活用したのは、さまざまなタイプの解析ルーチンを作成する場合です。たとえば、データベースに格納されている文字列として、単純な(または単純ではない場合もある)数式をデータに入れると便利なことがよくあります。プログラムが他の方法でプログラムによって制御される変数に対して任意の計算を実行する必要がある場合は、evalがそれを行うための最良の方法です。安全に管理された文字列を手動で解析することは、不必要に複雑になる可能性があります。

開発者として、クライアント側で何が起こるかを完全に制御することはできません。ユーザーはいつでもコンソールをいじって独自の問題を作成したり、JSの実行を妨げるブラウザ拡張機能をダウンロードしたりできます。私たちができる最善のことは、リスクへのエクスポージャーを制限することであり、ギャップのあるセキュリティホールを残すほど怠慢にならないようにすることです。

于 2019-12-17T20:42:28.783 に答える
-2

Eval()「元に戻す」と言われていても、非常に便利です。私はそれを使用してautoit、コードごとにコードを有効にします。

これは、独自のスクリプトを作成するためのコードプロセッサを作成するときに適用できます。

なぜ?私の場合、これを大規模なtcpサーバーで使用する場合、ソースコードを再コンパイルして、再起動の原因となるすべてのクライアントをキックする必要はありません。そのため、evalを使用して、構成のものとは異なり、その場で新しいスクリプトを追加します。静的ではなく、計算などに使用できます。また、evalを呼び出しコマンドと組み合わせると、関数からevalで値を設定できます。

しかし、それ以外に、使用するのはそれほど安全ではありません。このように使用しても、確実にフェイルセーフにすることをお勧めします。

于 2019-03-29T20:07:15.073 に答える