jQuery .globalEval()函数

Ran*_*lue 14 jquery

我偶然发现了.globalEval()浏览jQuery源代码的功能.有一些我不明白的简短文档.显然,它"对于动态加载外部脚本很重要".为什么?来源也有点模糊:

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 );
    }
},
Run Code Online (Sandbox Code Playgroud)

人们真的在现实生活中使用它吗?如果是这样,为了什么?

Jam*_*ice 15

顾名思义,它用于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
Run Code Online (Sandbox Code Playgroud)

因为example1是使用定义的globalEval,所以它在全球范围内.使用普通旧法线eval,该变量仅在eval调用的范围内可用.

如果要加载另一个JS脚本,并且想要在全局上下文中执行该脚本(例如,上面,我们可能需要example1example函数外部使用,因此我们必须使用它)globalEval.

我不知道为什么jQuery的源使用window[ "eval" ].call,而不是只eval.call,但我敢肯定有人可以解释一下:)