Pasar undefined a JavaScript Expresiones de función invocadas inmediatamente

A veces puede detectar código antiguo en la naturaleza dondeundefinedse pasa a una función. ¿Por qué?

Descubrí este pequeño truco mientras miraba al famosoVideo de Paul Irish sobre el código fuente de jQuery.

Ese video proviene de una época diferente y tiene 9 años en el momento de escribir este artículo, y el código fuente de jQuery ha cambiado desde entonces, por lo que no se puede detectar esta cosa allí, pero sigue siendo algo que encontré interesante.

Además, JavaScript ha cambiado desde entonces. Esta técnica solo se aplica a JavaScript anterior a ES5.

Antes de ES5, lanzado en 2009, este era un paso casi obligatorio.

Nota: las bases de código ES5 + ya no necesitan agregar esto porque ahoraundefinedes un valor de solo lectura.

A veces, en nuestro código, verificamos las variables para ver si están indefinidas, de esta manera:

if (car !== undefined) {

}

Si este es nuestro código, que se ejecuta en nuestros propios servidores, que controlamos, esto debería funcionar bien. Pero imagina que una biblioteca como jQuery necesita ser probada en batalla para que funcione en todos los sitios posibles.

Si alguien sobrescribeundefinedcon un simple

undefined = '🤔' //whatever value you prefer

entonces lo de arribaiffallaría, comparandocara🤔.

Desde entonces, esto se ha solucionado en ES5, pero era posible antes de eso.

Sicaren realidad no estaba definido, no había forma de averiguarlo ahora.

Excepto usando esta técnica: envolvemos todo nuestro código en un IIFE (Expresión de función invocada inmediatamente) y pasamos un parámetro a la definición de la función, sin agregarlo en la fase de invocación.

(function() {
  /* our function code */
})()
(function(undefined) {
  /* our function code */
})()

Ver,undefinedse pasa como argumento, pero no como parámetro cuando invocamos la función. Entonces, dentro de la función el valor de la variableundefinedes (garantizado) el valor original deundefined. Independientemente de lo que le hagan los otros scripts de la página, está aislado.

Ahora, mi forma favorita de resolver este problema es usar esta técnica para verificar valores indefinidos:

if (typeof car !== 'undefined') {

}

lostypeofEl operador devuelve una cadena con el tipo de variable. Podemos compararlo con el'undefined'string, y no tendríamos el problema anterior en primer lugar.

Pero siempre es bueno conocer las razones de algunas cosas que puede leer en el código escrito por otros, especialmente cuando se trata de código de nivel de biblioteca que debe ejecutarse en todas partes.


Más tutoriales de js: