2011-10-27 8 views
12

Me encontré con la función .globalEval() de navegar por la fuente jQuery. Hay muy breve documentation que no entiendo. Aparentemente, es "importante para cargar scripts externos dinámicamente". ¿Por qué? La fuente también es algo oscura:jQuery .globalEval() función

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

¿Las personas realmente usan esto en la vida real? Si es así, ¿para qué?

Respuesta

14

Se utiliza, como su nombre indica, para ejecutar el código eval en el contexto global. Por ejemplo, considere la siguiente (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 

Debido example1 se definió utilizando globalEval, es en el ámbito global. Utilizando la normal normal antigua eval, la variable solo está disponible en el ámbito en el que se llama al eval.

Puede ser útil si desea cargar otro script JS, y desea ejecutar ese script en el contexto global (por ejemplo, por encima, podríamos necesitamos example1 a estar disponible fuera de la función example, por lo que tenemos utilizar globalEval.

no estoy seguro de por qué la fuente jQuery utiliza window[ "eval" ].call en lugar de sólo eval.call, pero estoy seguro de que alguien podría explicar :)

+0

para mí, '(window.execScript || window.eval) (data) 'parece funcionar, lo que es aún más simple. – Neil

+0

@Neil: no creo que funcione en navegadores más antiguos (probablemente por qué jQuery proporciona un método de navegador cruzado para él). Esto ahora se está discutiendo en una pregunta de seguimiento: http://stackoverflow.com/questions/7922073/why-write-window-eval-call-window-data/ –