2013-07-25 11 views
7

In John Resig's slideshow su come stava costruendo jQuery 1.4, ha citato un punto in cui ha aggiunto una variabile undefined alla chiusura di jQuery perché "possiamo riutilizzare (la variabile)".Perché riutilizzare `undefined`?

undefined non è una variabile ordinaria:

> var undefined = 4 
    undefined 
> undefined 
    undefined 

Pertanto, sappiamo che non definita non è una variabile. Quindi, perché il valore di undefined deve essere non definito nell'origine jQuery?

Slide 31

+13

In vecchi browser, è stato possibile definire la 'undefined' globale. Questo non è più il caso. –

+1

@CrazyTrain Questa dovrebbe essere una risposta. –

+0

@CrazyTrain è giusto, è possibile definire definito all'interno di una chiusura: (function (non definita) { indefinito = 5; console.log (non definito); })() – Brian

risposta

10

perché in alcuni motori JavaScript è possibile impostare undefined ad un valore. Questo per assicurarsi che undefined sia davvero undefined.

+4

Io suggerirei contro proteggendo così. È solo stupido. Se le persone sono abbastanza stupide da ridefinire "indefinite", meritano quello che succederà. – Ven

+2

@ user1737909: Giusto, ma se si trattasse di uno script dannoso: O –

+1

@ user1737909 ci sono contesti che coinvolgono script da più fonti (si pensi a un sito di "pubblicità" con pubblicità), e quindi si potrebbe voler proteggere il proprio codice dalla stupidità altrui (o malizia). – Pointy

5

In aggiunta alla risposta di + Rocket Hazmat, è possibile ridurre le dimensioni del file dopo la compressione un po ', quando il codice utilizza spesso undefined. Questo perché una variabile locale undefined può avere il suo nome storpiato dal compressore, mentre il globale undefined non possono:

foo === undefined; 
//  ^----- don't touch this, put "undefined" in the compressed result 

(function (undefined) { 
    foo === undefined; 
})(); 
// may however be mangled to 
(function(u){foo===u})(); 
+1

o usare 'void 0': p. – Ven

+0

@ user1737909: 'void 0' non può essere ridotto da 6 caratteri. 'indefinito' può essere ridotto a 1. – josh3736

+0

Stai parlando di compressione o minz. gzip? – Ian