2011-10-27 44 views
12

我偶然發現了瀏覽jQuery源代碼的功能.globalEval()。有非常簡短的documentation,我不明白。顯然,這對於動態加載外部腳本非常重要。爲什麼?該來源也有點模糊: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); 
    } 
}, 

人們是否真的在現實生活中使用它?如果是這樣,爲了什麼?

回答

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 

因爲example1使用globalEval的定義,它是在全球範圍內。使用普通的舊正常eval,該變量僅在調用eval的範圍內可用。

,如果你想在另一JS腳本,它可以是有用的,並且要執行該腳本在全球範圍內(例如,上文中,我們可能需要example1example功能外可用,所以我們有使用globalEval

我不知道爲什麼jQuery的源使用window[ "eval" ].call,而不是僅僅eval.call,但我敢肯定有人可以解釋:)

+0

對於我來說,'(window.execScript || window.eval )(數據)'似乎工作,這更簡單。 – Neil

+0

@Neil - 我認爲它不適用於舊瀏覽器(可能爲什麼jQuery提供了一個跨瀏覽器的方法)。現在正在討論後續問題:http://stackoverflow.com/questions/7922073/why-write-window-eval-call-window-data/ –