2011-10-27 7 views
12

jQueryソースを参照して、.globalEval()関数を見つけました。私が理解していない非常に短いdocumentationがあります。明らかに、外部スクリプトを動的に読み込むことは重要です。どうして?ソースもやや曖昧です:jQuery .globalEval()function

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); 
    } 
}, 

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

答えて

14

名前が示すように、グローバルコンテキストで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スクリプトをロードしてそのスクリプトをグローバルコンテキストで実行したい場合に便利です(たとえば、上記の例では、がexample関数の外部で使用可能になる必要があります。 globalEvalを使用する。

を私がなぜjQueryのソースだけではなく、eval.callwindow[ "eval" ].callを使用していますが、私は、 `、誰かが私のために:)

+0

を説明することができると確信している(window.execScript || window.evalわからないんだけど)(データ) 'が動作しているように見えます。これはさらに簡単です。 – Neil

+0

@Neil - 古いブラウザではうまくいかないと思う(おそらく、jQueryがクロスブラウザー方式を提供する理由)。これは現在、フォローアップの質問で議論されています:http://stackoverflow.com/questions/7922073/why-write-window-eval-call-window-data/ –