Waarom schrijven `window [" eval "] .call (window, data);`

Regel 614 van jQuery 1.7rc1:

venster ["eval"] .call (venster, data);

Waarom niet gewoon schrijven

eval.call( window, data );?

9

2 antwoord

Het antwoord is hier: jQuery decoderen ,

Jim Driscoll ontdekte dat voor meer normen - met betrekking tot browsers,   je zou eval.call (venster, data) kunnen gebruiken, maar voor Chrome en IE, dingen   zijn een beetje anders.

     

Internet Explorer: IE lijkt Windows.execScript (gegevens)

te gebruiken      

Chrome: eval.call (venster, gegevens) breekt in Chrome, maar venster ["eval"   ] .call (venster, gegevens) werkt op Chrome, en ook op andere niet-IE   browsers, dit is hoe de bovenstaande oplossingen gebaseerd zijn op

7
toegevoegd
Hmm, eval.call werkt prima in Chrome 14 tenminste.
toegevoegd de auteur James Allardice, de bron
Ja, dat dacht ik ook. Ik merkte alleen op dat het wel werkt in Chrome 14. jQuery zal het moeten bijhouden zolang browsers waarin het niet werkt in de buurt zijn (wat voor altijd zal zijn!)
toegevoegd de auteur James Allardice, de bron
Ik heb niet geschreven dat de reden alleen een verklaring vond ... Kan zijn Chrome 14 is gewoon meer aan de normen dan oudere versies en aangezien jQuery de browser wil overstijgen en niet alleen de huidige browser, maar ze bewaarde het.
toegevoegd de auteur scrappedcola, de bron

Na het bekijken van de bron , heb ik deze link . Bekijk de benadrukte tekst:

Helaas breekt eval.call (window, src) in Chrome - het klaagt over   contexten niet overeenkomend. Vreemd - en ik kon niet waarom   misschien wel. Maar een paar gelukkige gissingen later, en dat ontdekte ik   window.eval.call (window, src) werkt op alle niet-IE-browsers. Nu, wanneer ik   zeg "var j = 1", het venster [j] is de variabele die is ingesteld ... Dus,   dat is goed. Waarom moeten we het extra venster toevoegen? op Chrome? Niet   zeker - ik zou het kunnen raden, maar het is te waarschijnlijk dat het fout is.

Dus window.eval wordt gebruikt om globalEval in Chrome te laten werken.

3
toegevoegd
Het lijkt goed te werken in Chrome 14. Maar dat artikel stamt uit 2009, dus ik zou niet verbaasd zijn als het een Chrome-bug was die nu is opgelost.
toegevoegd de auteur James Allardice, de bron
Ja ik weet het. Ik merkte alleen op dat het nu werkt in Chrome. Natuurlijk zal jQuery de oude Chrome-oplossing daarin moeten bewaren zolang oud-Chrome er nog is.
toegevoegd de auteur James Allardice, de bron
@JamesAllardice Er zijn nog steeds gebruikers die de nieuwste versie van Chrome niet gebruiken. jQuery is ontworpen om zoveel mogelijk browsers te ondersteunen.
toegevoegd de auteur Rob W, de bron
@Neil Ik realiseerde me net dat de huidige antwoorden niet hebben uitgelegd waarom window.eval noodzakelijk is. Bekijk deze bron, die een zeer grondige analyse van de methode eval is: perfectionkills.com/global-eval-what-are-the-options/…
toegevoegd de auteur Rob W, de bron
Dus wat is er mis met window.eval (data) ?
toegevoegd de auteur Neil, de bron
Bedankt voor die link, het verklaart dat window.eval.call (window, src) onnodig langdradig is. In feite zou (window.execScript || eval) (src) voldoende moeten zijn. (Als u execScript niet wilt gebruiken, is window.eval (src) het op één na beste.)
toegevoegd de auteur Neil, de bron