ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript アドバンスト シリーズ — eval を使用しない理由

JavaScript アドバンスト シリーズ — eval を使用しない理由

黄舟
リリース: 2017-02-08 09:40:36
オリジナル
1380 人が閲覧しました
  • 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 サイト (m.sbmmt.com) に注目してください。


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート