2012-03-07 21 views
56

he notado jQuery y relacionadas plugins magistrales como jQuery.UI pase undefined como un parámetro en funciones anónimas utilizados en sus definiciones del módulo, así:¿Cuál es el propósito del pase indefinido?

(function($, undefined) { ... })(jQuery); 

Alternativamente, he notado otros plugins recomendados por jQuery y/o los demás NO pase indefinido como un parámetro.

Esta es probablemente una pregunta tonta, pero ...

No debe siempre estar disponible de todos modos? ¿Por qué pasarlo? ¿Hay algún otro propósito o truco aquí?

Respuesta

68

Hay dos razones para ello:

1) Si undefined es una variable en el ámbito de la función en lugar de una propiedad de objeto global, minifiers puede reducir a una sola letra logrando así una mejor tasa de compresión.

2) Antes de ES5 *, undefined era una propiedad del objeto global sin protección contra escritura. Por lo tanto, podría sobrescribirse, dando como resultado un comportamiento extraño e inesperado. Se podría hacer algo como esto:

var test = 123; 
undefined = 123; 
if (test === undefined){ 
    // this will actually be true, since undefined now equals 123 
} 

Al tener un argumento de la función undefined (el nombre en realidad no importa), que no pasa un parámetro a, usted podría asegurarse de que tiene una variable que realmente es undefined para que pueda probar "indefinición" en contra de esta variable.

BTW.el método más seguro para la prueba de indefinido es: typeof (var) === 'undefined'

(*) Con EcmaScript 5, las propiedades globales undefined, NaN y Infinity se convirtió en sólo lectura. Por lo tanto, con su adopción general en todos los navegadores modernos, por supuesto, con la excepción de IE 9, ya no era posible sobrescribir esos valores.

+5

La razón por la que jQuery usa este método en lugar de 'typeof' es que se comprime mucho mejor en un minificador de JavaScript. – interjay

+1

Eso es cierto, sin embargo typeof es el método más seguro. También podría usar la naturaleza falsa de indefinido, que sería la comprobación más corta para "indefinido", pero está ensombrecida por la existencia de otros valores falsy. – Christoph

16

Esto se hace para asegurarse de que undefined siempre sea undefined. En versiones anteriores de la especificación ECMAScript (anterior a ECMAScript 5), undefined no era una palabra reservada, sino una variable regular. En los navegadores más antiguos esto se permitió por ejemplo:

undefined = 2; // Assign a different value to undefined 

// Now this statement would be true 
if (undefined == 2) 

Así que para asegurarse de que no definido es, de hecho, no definido, incluso si algún otro guión "mal" habría reasignado indefinido con otro valor, se crea un parámetro que se Llamada no definida, y luego cuando llamas a la función, asegúrate de no pasarle un valor a ese parámetro, así puedes estar seguro de que la variable indefinida siempre estará indefinida dentro de tu función.

Así, en el caso de jQuery:

(function($, undefined) { ... })(jQuery); 

Pasan en jQuery y asignarlo a la variable $ por conveniencia, pero luego no puedan pasar a un segundo valor al parámetro definido, por lo tanto voluntad indefinido ser indefinido

navegadores modernos

En los navegadores modernos, undefined es una propiedad no configurable, no escrito por el ECMAScript 5 specification.

10

undefined no es una palabra reservada en javascript, simplemente es una variable. jQuery se está asegurando de que si algún desarrollador malo sobrescribe el valor de indefinido en su javascript, jQuery lo ignorará y establecerá su propia variable, indefinida, que nunca tendrá un valor (vea la secuencia autoejecutable (jQuery) al final) y por lo tanto, no está definido.

Cuestiones relacionadas