jQuery .globalEval () funktsiyasi

.globalEval() funksiyasiga jQuery manbasini ko'rib chiqishdan qoqildim. Men tushuna olmaydigan juda qisqacha hujjatlar mavjud. Ko'rinishidan, "tashqi buyruqlarni dinamik ravishda yuklash uchun" muhimdir. Nima uchun? Manba ham biroz tushunarsiz:

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

Odamlar aslida buni haqiqiy hayotda qo'llayaptimi? Agar shunday bo'lsa, nima uchun?

13

1 javoblar

Odatda, eval kodini global kontekstda bajarish uchun foydalaniladi. Masalan, quyidagilarni ko'rib chiqing ( 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 yordamida aniqlandi, chunki u global miqyosda. Oddiy oddiy oddiy eval dan foydalanib, o'zgaruvchilar faqat eval deb ataladigan sohada mavjud.

Boshqa bir oyna skriptini yuklamoqchi bo'lsangiz, bu foydali bo'lishi mumkin va siz ushbu skriptni global kontekstda (masalan, yuqorida example1 kerak bo'lishi mumkin namuna funktsiyasi, shuning uchun globalEval ni ishlatishimiz kerak.

Ishonchim komilki, nima uchun jQuery manbai eval.call o'rniga window ["eval"] .call dan foydalansa-da, lekin kimdir tushuntirishi mumkin :)

15
qo'shib qo'ydi
@Neil - Men eski brauzerlarda ishlay olmayman deb o'ylamayman (ehtimol jQuery nima uchun o'zaro faoliyat brauzer usulini taqdim etadi). Bu endi keyingi savolda muhokama qilinadi: " stackoverflow.com/questions/7922073/…
qo'shib qo'ydi muallif James Allardice, manba
Men uchun (window.execScript || window.eval) (ma'lumotlar) ishlayotgan ko'rinadi, bu ham sodda.
qo'shib qo'ydi muallif Neil, manba