jQuery .globalEval()関数

jQueryソースをブラウズして、 .globalEval()という関数を見つけました。私が理解していない非常に簡単なドキュメントがあります。明らかに、外部スクリプトを動的に読み込むことは重要です。どうして?ソースもやや曖昧です:

globalEval: function( data ) {
    if ( data && rnotwhite.test( data ) ) {
       //We use execScript on Internet Explorer
       //We use an anonymous function so that context is window
       //rather than jQuery in Firefox
        ( window.execScript || function( data ) {
            window[ "eval" ].call( window, data );
        } )( data );
    }
},

人々は実際にこれを実生活で使用していますか?もしそうなら、何のために?

13

1 答え

これは、名前のように、グローバルコンテキストで eval コードを実行するために使用されます。たとえば、次のようなものを考えてみましょう( jsFiddle )。

function example(){
  $.globalEval("var example1 = 'first';");
  eval("var example2 = 'second';");
    console.log("In function: " + example1); //Prints 'first'
    console.log("In function: " + example2); //Prints 'second'
}
example();
console.log("Global: " + example1); //Prints 'first'
console.log("Global: " + example2); //ReferenceError

example1globalEval を使用して定義されているため、グローバルスコープにあります。普通の普通の eval を使用すると、変数は eval が呼び出されるスコープ内でのみ使用可能です。

別のJSスクリプトをロードしてそのスクリプトをグローバルコンテキストで実行したい場合に便利です(たとえば、 example1example 関数であるため、 globalEval を使用する必要があります。

なぜjQueryソースが eval.call の代わりに window ["eval"] .call を使うのか分かりませんが、誰かが説明できると確信しています:)

15
追加された
@Neil - 古いブラウザーではうまくいかないと思う(おそらくjQueryがクロスブラウザー方式を提供するのはなぜだろう)。これは現在、フォローアップの質問で議論されています: stackoverflow.com/questions/7922073/…
追加された 著者 James Allardice,
私にとっては、(window.execScript || window.eval)(data)がうまくいくように思えます。
追加された 著者 Neil,