2011-07-01 8 views
1
<html> 
<body> 
<script type="text/javascript"> 
document.write("<br />" + eval("2+2")); 
</script> 
</body> 
</html> 

は、それは私にあなたの観察はかなり正確である4Javascriptの内部でeval関数を使用するのは何ですか?私はeval関数を削除して、同じことを実行する場合はこれが私の4</p> <p>として出力を与える

<html> 
<body> 
<script type="text/javascript"> 
document.write("<br />" + (2+2); 
</script> 
</body> 
</html> 

答えて

0

eval()は、文字列を受け取り、それが1でなかったかのようにそれを評価します。 (2+2)は文字列ではありません。 「のeval」で

console.log (typeof (2+2)); // returns number 

console.log (typeof "2+2"); // returns string 
1

で同じ出力を提供します知っています。 eval()は、evaluate Javascriptコード以外は何もしません。したがって、結果は同一です。しかし、eval()の使用法はかなり面倒です。セキュリティとパフォーマンスの理由からです。

たとえば、Javaのエンジン(少なくともそれらのほとんど)は、アクセスのパフォーマンスに関してコードを常に最適化しようとします。ここで深く掘り下げることなく、かなり深いスコープチェーンプロパティにアクセスするのはコストがかかるので、エンジンはそのアクセスをハッシュルックアップテーブルで最適化します。 eval()を呼び出すことで、このメカニズムを使用することができなくなり、プロパティの参照が遅くなります。

これは、eval()の使用が推奨されない理由の1つに過ぎません。

2

評価はあなたが変数に格納されたコマンドを実行することができます:それはスクリプトであるかのように

<script type="text/javascript"> 
var cmd = "2+2"; 
document.write("<br />" + eval(cmd)); 
</script> 
+0

それは必ずしも変数に格納する必要はありません。 – jAndy

+0

同意するが、eval()の利点を説明したかった –

1

eval文字列を実行しようとする - それは効果がありませんので、あなたの例では(2+2)は、文字列ではありません。また

eval is evil ...

1

、あなたはこのようなことを行うことができます。

<html> 
<body> 
<script type="text/javascript"> 
    var command = prompt('input command'); 
    eval(command); 
</script> 
</body> 
</html>