jQuery .globalEval () functie

Ik struikelde over de functie .globalEval() om door de jQuery-bron te bladeren. Er is een zeer korte documentatie die ik niet begrijp. Blijkbaar is het "belangrijk voor het dynamisch laden van externe scripts". Waarom? De bron is ook enigszins obscuur:

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

Gebruiken mensen dit ook in het echte leven? Zo ja, waarvoor?

13

1 antwoord

Het wordt gebruikt, zoals de naam al doet vermoeden, om de code eval in de globale context uit te voeren. Neem bijvoorbeeld het volgende in overweging ( 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

Omdat example1 is gedefinieerd met globalEval , valt deze binnen het bereik van de hele wereld. Met de gewone oude normale eval is de variabele alleen beschikbaar in het bereik waarin eval wordt aangeroepen.

Het kan handig zijn als u een ander JS-script wilt laden en u wilt dat script uitvoeren in de globale context (we hebben bijvoorbeeld example1 mogelijk buiten de voorbeeld functie, dus we moeten globalEval gebruiken.

Ik weet niet zeker waarom de bron jQuery window ["eval"] .call gebruikt in plaats van alleen eval.call , maar ik weet zeker dat iemand dit kan uitleggen :)

15
toegevoegd
@Neil - Ik denk niet dat het zal werken in oudere browsers (waarschijnlijk waarom jQuery een cross-browser-methode daarvoor biedt). Dit wordt nu besproken in een vervolgvraag: stackoverflow.com/questions/7922073/…
toegevoegd de auteur James Allardice, de bron
Voor mij lijkt (window.execScript || window.eval) (data) te werken, wat nog eenvoudiger is.
toegevoegd de auteur Neil, de bron