0

Есть такой блок кода

let testObj = {
  success:console.log("true"),
  error:console.log("error")
}
const val = true;
if(val){
  testObj.success()
} else {
  testObj.error()
}

Проверяю в консоли codepen вроде без ошибок.

Почему в таком подходе работает и success и error? То есть первым пишет "true", а потом "error"

Самое главное чего я не понимаю - у меня же фактически значение if-а true почему он переходит в else? Это же не логично.

Kromster
  • 13,809
Randall
  • 7,054
  • 2
    У вас функции вызываются сами по себе, удалите условие, в консоли все равно будет выводиться текст. – DaemonHK Jul 11 '19 at 05:43

5 Answers5

7

Давайте разберем логику вашего кода.

let testObj = {  // Инициализация объекта
  success:console.log("true"), // задаете свойство "Успех", который будет равен результату выполнения функции console.log("true")
  error:console.log("error") // аналогично предыдущему только значение "error"
}

При инициализации объекта отработали обе функции чтобы в ваш объект записать значение(отсюда вы видите в консоли оба значения "true" и "error", НО! функция console.log() НЕ ВОЗВРАЩАЕТ никакого результата (отсутствует return).

Итог: вы имеете объект testObj, у которого оба свойства success и error буду равны undefined.

const val = true; 
if(val){
  testObj.success() // заходит сюда потому что значение val = true и ожидаем что в свойстве success 
будет функция, которую пытаемся вызвать. Но там undefined. Отсюда ошибка 
} else {
  testObj.error()
}
doox911
  • 3,818
radar4ick
  • 1,325
1

Не совсем так. В оба блока не заходит. Выполните код и увидите, что выводит 2 сообщения в консоль (2 и 3 строчки) и ошибку

"testObj.success is not a function".

Т.е. заходит только в 1 блок и в нем падает с ошибкой.


Проверяйте код в консоли Хрома. Или в своем вопросе даже, преобразуйте фрагмент кода в сниппет и все увидите:

let testObj = {
  success:console.log("true"),
  error:console.log("error")
}
const val = true;
if(val){
  testObj.success()
} else {
  testObj.error()
}
Kromster
  • 13,809
0

У вас синтаксически код неверный. В testObj поля, которые вы пытаетесь вызвать в блоке, не являются функциями, а вы пытаетесь их как функции вызвать. Я вообще не понимаю, как код запустился.

let testObj = {
  success:"true",
  error:"error"
}
const val = true;
if(val){
  console.log(testObj.success)
} else {
  console.log(testObj.error)
}
Alex Sazonov
  • 2,837
  • 3
    Синтаксически у него всё верно. – Qwertiy Jul 11 '19 at 05:41
  • даже если что то не верно.Почему он заходит в оба блока вот в чем вопрос? – Randall Jul 11 '19 at 05:42
  • @Qwertiy угу, еще бы хром не ругался, что это не функции – DaemonHK Jul 11 '19 at 05:44
  • 1
    @DaemonHK, ну так надо различать синтаксис и рантайм. – Qwertiy Jul 11 '19 at 05:44
  • @Demon__ANT, я тебе ответил, но ты предпочёл поставить минус. – Qwertiy Jul 11 '19 at 05:45
  • 2
    @Qwertiy так это же не ответ.там ничего не понятно.Суть моего вопроса в то что почему он заходит в оба блока – Randall Jul 11 '19 at 05:45
  • 1
    @Demon__ANT, а суть ответа, что это не так. – Qwertiy Jul 11 '19 at 06:51
0

По идее должно быть так:

let testObj = {
    success: "success",
    error: "error",
    showSuccess: function(){
        console.log(this.success);
    },
    showError: function(){
        console.log(this.error);
    }
};

const val = true;

if(val){
    testObj.showSuccess();
} else {
    testObj.showError();
}

Или в сокращенном виде:

let testObj = {
    success: "success",
    error: "error",
};

const val = true;

if(val){
    console.log(testObj.success);
} else {
    console.log(testObj.error);
}
DaemonHK
  • 2,300
-6

Ты вообще функции не сделал:

let testObj = {
  success:console.log("true"),
  error:console.log("error")
}
Qwertiy
  • 123,725