web-dev-qa-db-ja.com

JavaScriptでeval()を使用する主な利点は何ですか?

これは初心者の質問かもしれませんが、eval()の主な利点について興味があります-どこで使用するのが最適でしょうか?どんな情報でも感謝します。

44
Coffee

eval関数の使用が最適です:Never。

その目的は、ストリングをJavascript式として評価することです。例:

eval('x = 42');

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

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

適切な方法は次のとおりです。

document.frm[frmName].value = text;

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

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

44
Guffa

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

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

[〜#〜] edit [〜#〜]

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

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

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

そのメモでは、eval()のような文を書くことは悪であるか、決して使用すべきではない、と完全に間違っていると思います。 これらのようなブランケットステートメントは本当の悪です!

32
Matt Way

evalを使用すると、javascriptコードの文字列を実行(または評価)できます。

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

または、あなたのウェブサイトがプログラマーをターゲットにしている場合は、独自のプラグインを作成して実行することもできます。

10
Imp

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

eval()はかつてJSON文字列の解析に使用されていましたが、その使用はより高速で安全なJSON.parse

7
SLaks

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

eval() = evil

まったく使用しないでください。簡単なコード挿入に使用できますが、誰かがeval()を使用して不正なスクリプトを挿入できます。 JSONの解析にeval()を使用する場合があります、または

_eval("obj." + id);   //newbies
_

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

_obj[id];             //should-do
_
4

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

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

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

3
PitaJ

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

2
Swesh

私は間違っているかもしれませんが、古典的な文字列(ファイルから)をES6テンプレート文字列に変換するために使用しています:

let name = 'Daman'
let classicString = 'Hello ${name}'
let templateString = eval('`' + classicString + '`')

それは私に必要なものだけを提供します:

"Hello Daman"
1
Damjan Pavlica

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

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

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

1
ykorach

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

0
serup

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

0
user3468426

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

0
Raoul