2011-11-04 3 views
21

У меня есть функция, которая принимает 3 параметра. У меня есть один из параметров - свойство иногда неопределенного значения объекта (т.е. оно принимает значение .? thing.foo.bar, а иногда thing.foo не определен, поэтому он не может получить доступ к бара)Javascript «невозможно прочитать свойство« bar »undefined

Что способ обойти это в описании функции, у меня есть условная проверка: if (!parameterName), но браузер (Chrome) все еще бросает ошибку, что он не может прочитать bar свойство undefined.

Спасибо!

+1

Я думаю, что я понимаю, но не совсем ... Можете ли вы опубликовать свой код? –

ответ

32

Если свойство объекта может относиться к какому-либо другому объекту, то вы можете проверить что за неопределенные, прежде чем пытаться использовать его свойство:

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

Я мог бы обновить мой ответ, чтобы лучше отразить вашу ситуацию, если вы показываете какой-то фактический код, но, возможно, что-то вроде этого:

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

@ Mörre: Это работает отлично. OP явно заявляет, что 'thing.foo' не определено, поэтому он должен быть объявлен _has_. – Cerbrus

6

проверка соединения:

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

Это синтаксическая ошибка .. она должна быть 'thing.foo && thing.foo.bar' – Reid

+0

Спасибо. исправлен .. поздняя ночь. –

2

Просто проверьте его перед тем, как перейти к вашей функции. Таким образом, вы бы передать:

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

Вы можете защитить себя любой из этих двух способов:

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 
    } 
} 

В первом примере, вы явно проверить все возможные элементы переменной вы ссылаетесь, чтобы сделать убедитесь, что это безопасно, прежде чем использовать его, чтобы вы не получали никаких незапланированных ссылочных исключений.

Во втором примере вы просто помещаете вокруг него обработчик исключений. Вы просто получаете доступ к thing.foo.bar при условии, что он существует. Если он существует, то код работает нормально. Если он не существует, тогда он выдает исключение, которое вы поймаете и проигнорируете. Конечный результат тот же. Если thing.foo.bar существует, ваш код с его помощью выполняется. Если он не существует, то код не выполняется. Во всех случаях функция работает нормально.

Оператор if выполняется быстрее. Исключением может быть проще кодировать и использовать в сложных случаях, когда может быть много возможных вещей для защиты и ваш код структурирован так, что бросать исключение и обрабатывать его - это чистый способ пропустить выполнение, когда некоторая часть данных не существует , Исключения немного медленнее, когда выбрано исключение.

Смежные вопросы