EVALは悪ですか? (eval関数は悪魔ですか?)



Eval Is Evil Is Eval Function Devil



1. evalの使い方は?

  • eval()関数を使用して、文字列を計算し、その中でjavascriptコードを実行できます。その構文eval(string)
  • 渡された引数が文字列でない場合、この引数は直接返されます。

2. evalはいつ使用されますか?

  • どのステートメントを実行するかが事前にわからない場合は、どのステートメントを実行するかを知るために条件とパラメーターのみが与えられます。
  • デモ
<!DOCTYPE html> <html> <head> <title></title> <style type='text/css'> #box{ width: 406px height: 500px border: 1px solid black margin: 50px auto } #screen{ width: 100% height: 100px font: 20px text-align: right /*overflow: hidden*/ } #top,#bottom { width: 100% height: 49px border-bottom: 1px solid black float: left } #number{ width: 306px float: left } #mark{ width: 100px /*height: 00px*/ float: left } #number div{ width: 100px height: 100px border: 1px solid black float: left } #mark div{ height: 100px border: 1px solid black } .center { text-align: center font: 20px/100px 'simhei' } </style> </head> <body> <div id='box'> <div id='screen'> <div id='top'></div> <div id='bottom'></div> </div> <div id='number' class='center'> <div value='1'>1</div> <div value='2'>2</div> <div value='3'>3</div> <div value='4'>4</div> <div value='5'>5</div> <div value='6'>6</div> <div value='7'>7</div> <div value='8'>8</div> <div value='9'>9</div> </div> <div id='mark' class='center'> <div value='+'>+</div> <div value='-'>-</div> <div value='='>=</div> </div> </div> <script type='text/javascript'> var num = document.getElementById('number') var number = num.getElementsByTagName('div') var mark = document.getElementById('mark').getElementsByTagName('div') var screen = document.getElementById('screen') var top1 = document.getElementById('top') var bottom = document.getElementById('bottom') addClick(number) addClick(mark) function addClick(obj) { console.log(obj) for (var i = 0 i < obj.length i++) { obj[i].onclick = function () { if (this.innerHTML== '=') { var str = bottom.innerHTML var result = eval(str) top1.innerHTML = bottom.innerHTML + '=' bottom.innerHTML = result }else{ bottom.innerHTML += this.innerHTML } } } } </script> </body> </html>

デモ

3.なぜevalは悪なのか?

「評価は悪」という言葉は、ダグラス・クロックフォードが言ったことです。 「悪」は通常、「危険」、より正確には「単純なコマンドで大きな問題を引き起こす可能性がある」ことを意味します。次に、これらの「邪悪な」ものをいつ使用しますか。または、危険が何であるかを知っているとき、適切な予防措置を講じる方法は?



評価の危険性は?

eval関数には多くの小さな問題があるかもしれません。当時、一般的に2つの大きな問題がありました。そのため、evalは悪だと人々は考えています。 (パフォーマンスとコードインジェクション)

  • パフォーマンス-eval関数を実行するには、インタープリター/コンパイラーを実行する必要があります。コードがコンパイルされている場合、非常に重いコンパイラを呼び出す必要があるため、これは大きな問題です。ただし、javascriptはインタプリタ言語です。つまり、通常の状況では、eval関数がパフォーマンスに大きな影響を与える可能性はほとんどありません。構文解析中にjavascript、インタープリター、またはコンパイラーも呼び出す必要があると思います。別のインタプリタまたはコンパイラを個別に呼び出す必要はありません。この場合、eval関数はあなたの時間を無駄にするものよりも「悪」ではありません。
  • コードインジェクションの問題evalは、特権昇格を伴うコードを実行する場合があります。たとえば、管理者またはルート権限で「rm-rfsomething-important」のような文字列を実行します。しかし、プログラムはとにかく独自のアカウントで実行されているため、ブラウザのjavascriptにはこの問題はありません。

evalは悪ですか?

個々の問題を個別に処理する必要がある可能性があります。そのため、evalは悪ではないと思います。