Aunque lo que publicaste se ve comúnmente, personalmente no creo que sea la mejor manera de hacerlo.
MY_NAMESPACE
podría evaluar a falso por varias razones que no sean undefined
- la variable realmente podría definirse pero tenga 0
o false
o un cadena vacía, y que podría terminar sustituyendo este valor.
MY_NAMESPACE
podría evaluar a cierto por varias razones que no sean ya de ser un objeto - que podría ser un número distinto de cero o true
o una cadena, y esto hará que el script falle en silencio, ya que agregar propiedades a una primitiva fallará sin un error.
Realmente, la mejor manera depende de cuál es su objetivo. Si no desea contaminar una variable/espacio de nombres existente, se debe hacer una verificación typeof
y detener si la variable ya está definido, pero no un objeto:
if (typeof MY_NAMESPACE == 'undefined') {
// create a new namespace
MY_NAMESPACE = {};
}
if (typeof MY_NAMESPACE == 'object') {
// go ahead
} else {
// MY_NAMESPACE was already defined, but it is not an object
// your script will fail if you continue, so do what you must and stop
}
Si su script necesidad trabajo, a ciegas crea el espacio de nombres sin ningún control (por supuesto, no estoy recomendando que hagas esto).
Editar: (en respuesta al comentario de @ jball, pensó que acababa de añadir aquí)
Si este espacio de nombres es parte de una biblioteca que se está desarrollando, a continuación, es imprescindible que nombre su espacio de nombres con cuidado para evitar colisiones. Si encuentra una colisión, es mejor simplemente dejar de cargar su biblioteca que mezclar su biblioteca con otra y obtener resultados inesperados.
Si este espacio de nombres es solo para su propia aplicación, debería ser bastante sencillo elegir un nombre que no esté siendo utilizado por ninguna biblioteca que esté utilizando.
Ejemplo de "filtración en otro ámbito" - 'window.MY_NAMESPACE = window.MY_NAMESPACE || {}; ' – jball