2011-11-04 45 views
21

Tengo una función que tiene 3 parámetros. El problema que tengo es uno de los parámetros es una propiedad de un valor indefinido a veces de un objeto (es decir, lleva en .? thing.foo.bar, ya veces thing.foo no está definido, por lo que no puede acceder a la barra )Javascript "no se puede leer la propiedad" barra "de indefinido

¿Qué es una forma de evitar esto Dentro de la declaración de la función, tengo una comprobación condicional: if (!parameterName), pero el navegador (Chrome) sigue arrojando un error que no puede leer barra propiedad de undefined.

¡Gracias!

+1

Creo que entiendo algo, pero no realmente ... ¿puedes publicar tu código? –

Respuesta

32

Si la propiedad de un objeto puede hacer referencia a algún otro objeto, entonces puede probar que de indefinido antes de intentar utilizar sus propiedades:

if (thing && thing.foo) 
    alert(thing.foo.bar); 

pude actualizar mi respuesta para reflejar mejor su situación si muestra algún código real, pero posiblemente algo como esto:

function someFunc(parameterName) { 
    if (parameterName && parameterName.foo) 
     alert(parameterName.foo.bar); 
} 
+0

@ Mörre: Esto funciona bien. OP declara explícitamente que 'thing.foo' no está definido, por lo que _hace_ ser declarado. – Cerbrus

6

comprobación Compuesto:

if (thing.foo && thing.foo.bar) { 
     ... thing.foor.bar exists; 
    } 
+1

Eso es un error de sintaxis .. debe ser 'thing.foo && thing.foo.bar' – Reid

+0

Gracias. arreglado ... tarde en la noche. –

2

Simplemente verifíquelo antes de pasar a su función. Por lo que pasaría:

thing.foo ? thing.foo.bar : undefined 
7

Usted puede protegerse a sí mismo cualquiera de estas dos maneras:

function myFunc(thing) { 
    if (thing && thing.foo && thing.foo.bar) { 
     // safe to use thing.foo.bar here 
    } 
} 

function myFunc(thing) { 
    try { 
     var x = thing.foo.bar; 
     // do something with x 
    } catch(e) { 
     // do whatever you want when thing.foo.bar didn't work 
    } 
} 

En el primer ejemplo, se comprueba de forma explícita todos los elementos posibles de la variable que se está haciendo referencia a hacer Asegúrese de que sea seguro antes de usarlo para que no tenga excepciones de referencia no planificadas.

En el segundo ejemplo, simplemente coloca un manejador de excepciones alrededor. Acabas de acceder al thing.foo.bar suponiendo que existe. Si existe, entonces el código se ejecuta normalmente. Si no existe, lanzará una excepción que atraparás e ignorarás. El resultado final es el mismo. Si existe thing.foo.bar, se ejecutará el código que lo utiliza. Si no existe ese código no se ejecuta. En todos los casos, la función se ejecuta normalmente.

La instrucción if es más rápida de ejecutar. La excepción puede ser más simple de codificar y usar en casos complejos en los que puede haber muchas cosas posibles de protección y su código está estructurado de modo que lanzar una excepción y manejarlo es una manera limpia de omitir la ejecución cuando no existe algún dato . Las excepciones son un poco más lentas cuando se lanza la excepción.

Cuestiones relacionadas