Fake eval
セキュリティの問題
結論
eval 関数は、現在のスコープで JavaScript コード文字列を実行します。
var foo = 1; function test() { var foo = 2; eval('foo = 3'); return foo; } test(); // 3 foo; // 1
しかし、eval が直接呼び出され、呼び出し関数が eval 自体である場合、eval は現在のスコープでのみ実行されます。
var foo = 1; function test() { var foo = 2; var bar = eval; bar('foo = 3'); return foo; } test(); // 2 foo; // 3
翻訳者注: 上記のコードは、グローバル スコープで eval を呼び出すことと同等であり、次の 2 つの記述メソッドと同じ効果があります:
// 写法一:直接调用全局作用域下的 foo 变量 var foo = 1; function test() { var foo = 2; window.foo = 3; return foo; } test(); // 2 foo; // 3 // 写法二:使用 call 函数修改 eval 执行的上下文为全局作用域 var foo = 1; function test() { var foo = 2; eval.call(window, 'foo = 3'); return foo; } test(); // 2 foo; // 3
どのような状況でも eval 関数の使用は避けるべきです。 eval を使用するシナリオの 99.9% には、eval を使用しないソリューションがあります。
偽装された eval
スケジュールされた関数 setTimeout と setInterval は両方とも、最初のパラメーターとして文字列を受け入れることができます。 この文字列は常にグローバル スコープで実行されるため、この場合 eval は直接呼び出されません。
セキュリティの問題
eval にはセキュリティの問題もあります。コード文字列が不明な場合、または信頼できないソースからのものである場合は、eval 関数を決して使用しないでください。
結論
eval は絶対に使用しないでください。eval を使用するコードは、その動作方法、パフォーマンス、セキュリティの点で疑わしいものになります。 何らかの状況で適切に動作させるために eval の使用が必要な場合は、まずその設計が疑問視され、これは推奨されるソリューションではなく、eval を使用しないより良いソリューションを十分に検討し、優先順位を付ける必要があります。
上記は JavaScript の上級シリーズです - eval を使用してみてはいかがでしょうか。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。