2009-10-20 7 views
6

可能性の重複:
When is JavaScript’s eval() not evil?JavaScriptのevalの目的は何ですか?

私は、一般的にeval()を使用して、知っては悪い習慣です。

しかし、それはどのような目的のために存在していますか?

eval()の正しい目的は何ですか?

eval()はどのような状況で使用するのが良いですか?

+1

のhttp:/ /en.wikipedia.org/wiki/Eval#JavaScript –

+10

'evil()'のスペルが間違っています。それを使用しないでください。 – slikts

+1

* rollseyes * evalは必ずしも悪くはありません、それはあなたがそれを使う意思に依存し、時には本当に他の方法もありません。 –

答えて

8

eval

特定 オブジェクトを参照することなくJavaScriptコード の列を評価します。

算術式を文字列として作成する場合は、後で評価するためにevalを使用できます。たとえば、変数xがあるとします。変数に式の文字列値、たとえば "3 * x + 2"を代入し、スクリプトの後の時点でevalを呼び出すことによって、xを含む式の評価を延期できます。それは、発信者の権限で渡されたコードを実行し、危険な機能を、eval()関数

にevalを使用しているとき

ことに注意してください。 eval()を悪意のある当事者の影響を受ける可能性のある文字列で実行すると、Webページ/拡張機能の権限で悪質なコードが実行される可能性があります。

+0

+1この回答は私には分かりそうなので私はそれをupvoted。だれかが理由を説明しなければなりません。 –

+0

"evalを使用しない"のためのdownvoteですか? – rahul

+0

私は知らないが、答えに奇妙なdownvoteがあった。それは今行ったようです。 –

2

this articleにチェックを入れたいと思うかもしれませんが、以下はevalのパワーを要約したページの直接引用です。

Webベースのアプリケーションの動的 コンテンツを使用する場合はJavaScript EVALコマンドが 非常に強力することができます。 EVALはコードを減らすことができ、読み込み時に が不明なデータとのやりとりを容易にしますが、欠点としては があります。

このコマンドの実際の電力が負荷時間 - 例えば、 ユーザが入力したデータでは知られていない れるデータを操作するその 能力です。私は を持っているので、 を提供し実行した文字列を受け取り、 を返します(該当する場合)。 これを使用してJavaScriptを実行する に実行依頼されているものは、読み込み時には分かりません。 の場合 という計算式を使用してユーザーが を入力して結果を返すスクリプトがある場合、 はEVALを使用して の計算を実行できます。

+0

これは 'EVAL'ではなく' eval'です。 –

+0

ああ、本当に!それは引用です。あなたの苦情を著者に送ってください。 –

+0

私はそれが引用であることを認識していますが、あなたの答えで引用することを選択しました。誰も本当にこの質問の文脈で大文字で混乱することはないと確信していますが、関数名が大文字と小文字を区別する言語で関数の名前を提示するのは奇妙な方法です。 –

1

私は危険であるとそれほど悪くはないと思います。人々は濫用のための抜け穴を開くので、evalを使用しないと言います。あなたの入力が安全であれば、それを使用することはOKです。たとえば、入力が正規表現を使ってチェックされ、 "危険な"コンテンツがないことを確認した後、Doug Crockford's JSON parserで使用されます。

あなたがそれを使用しないことを伝える他の理由は、あなたがevalを使いすぎると、人々がEval Knievelと呼ぶようになるということです。

8

eval()は、JavaScriptコンパイラへのアクセスを提供し、最終的にコードを後で実行することができます。関数に渡された引数はJavaScriptコンパイラに渡され、コードが実行されます。

開発者はeval()のセキュリティについて主張しています。 で安全性は低くなりますが、入力を確実に確実に処理してから入力しても問題ないはずです。

また、コードがまだコンパイルされずキャッシュされていないため、eval()の結果は一般的に遅くなります。明らかに、この関数を使用するとパフォーマンスが低下します。

eval()の結果のコードをデバッグすることも難しくなります。最終的に実行されるコードに関するコンテキスト情報(行番号を考える)がほとんどないからです。

eval()の現在の最も一般的な用途の1つは、AjaxアプリケーションのコンテキストでJSON文字列を通常はにデシリアライズすることです。しかし、これは多くの他の用途がないと言っているわけではありません。

+0

私はこの答えが最高です - いいえBS、ちょうど知的に書かれた答え:) –

0

私は最近、新しいプロジェクトのための新しいコンベンションを考えようとしている間にeval()コマンドで実験していました。私が望んで

はこのだった:私は プライベート、公共 、そして特権方法、ALAを持つというアイデアが好きでした。 Doug Crockford's articleですが、私はいつものように底の代わりに私のクラスのTOPにパブリックメソッド/変数を公開できるようにしたかったのです。

これを考えてみましょう:

var Singleton = function() { 
    // Public 
    var $interface = { 
     one: $forward, 
     two: $forward 
    }; 

    // Private 
    function _one() { 
     // code... 
    } 

    function _two() { 
     // code... 
    } 

    // This does the magic 
    return eval($init); 
}('Singleton'); 

そして、すべてのオッズとコモンに対する:私はこの構文を持つことができました(主なものの中にネストされた2)3 eval()年代で

var Singleton = function() { 
    // Private 
    function _one() { 
     // code... 
    } 

    function _two() { 
     // code... 
    } 

    // Public 
    return { 
     one: _one, 
     two: _two 
    }; 
}(); 

それがうまくいった感覚。 (私の名前空間をデバッグして、シングルトンに渡された文字列を見ることができるようにしたいことに注意してください。$initもこれを処理しました)。

とにかく、 eval()は必ずしもすべてのコストをかけて回避する必要があるJavaScriptリットルの病気のラントではなく、サーバーやJSON逆シリアル化から送信された(信頼できる)コードよりも多くの方法で使用できます。

(私は以来、私自身は、すべての後にプライベート・メソッド/変数を気にしてばかり厳格な名前空間規則を使用していない確信していたとして、私の場合、それは、精神的なワークアウトとなってしまったが。)

関連する問題