ホームページ >ウェブフロントエンド >jsチュートリアル >eval スキルと window.eval_javascript スキルの差異分析

eval スキルと window.eval_javascript スキルの差異分析

WBOY
WBOYオリジナル
2016-05-16 18:09:081176ブラウズ
それらの間に違いはありますか?

開発プロセス中に、不要と考えられる追加のウィンドウを追加する人はほとんどいないようです。たとえば、Ajax プロセスのコールバック関数は JSON 形式の文字列を解析します
コードをコピー コードは次のとおりです:

..
関数コールバック(str){
var json = eval('(' str ')');
}
...

通常は var json = window.eval('(' str ')'); ではなく eval を直接使用します。
たとえば、alert はデバッグ時に使用されますが、window.alert を使用する人はほとんどいません。 IE でイベント オブジェクトを取得しますが、それを使用する人はほとんどいません。 (Firefox はイベントもサポートしていますが、場合によっては window.even をサポートしていません。興味のある学生はこの記事を読んでイベント オブジェクトを取得できます)

ただし、各エンジンの実装の違いにより、依然として相違点があります。 。 の。
コードをコピーします コードは次のとおりです。

var x = 5; fn() {
var x = 'jack';
eval('x=10;')
fn(); // -- >5


すべてのブラウザでの出力は 5 です。これは、fn を呼び出した後、eval がグローバル x ではなく fn 内のローカル変数 x を変更することを意味します。つまり、eval によって実行されるクロージャ環境は fn 内にあります。
上記のコードの eval を変更して window.eval に置き換えます。テストの結果、ブラウザーごとにパフォーマンスが異なることがわかりました。

IE6/7/8: 引き続き 5 を出力します。つまり、グローバル変数 x は変更されませんが、ローカル変数 x は変更されます。
IE9/Firefox/Safari/Chrome/Opera: 出力 10、グローバル変数 x が変更されます。

結論を導き出すことができます。
IE6/7/8 では、eval は、カスタム関数に記述されている場合はローカル クロージャであり、それ以外の場合はグローバル クロージャです。
IE9/Firefox/Safari/Chrome/Operaでは、evalは上記IE6/7/8と同様、カスタム関数内にwindow.evalを記述してもグローバルクロージャとなります。

また: IE の window.execScript は常にグローバル クロージャーの下で実行されますが、驚くべきことに Chrome もこのメソッドをサポートしています。ああ、Chrome ポリシーは標準であり、IE もこれを欠くことはできません。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。