Почему этот троичный оператор не работает?разве не троичный оператор есть функции? - PullRequest
0 голосов
/ 02 мая 2019

Я только что узнал о троичном операторе, но он не работает так, как я ожидал. Если это действительно сбивает с толку. Я получаю ошибку в консоли снова и снова, и я не понимаю, почему.

Нормальная функция дает мне неопределенное значение, и это нормально, но троичный оператор выдает ошибку «не определено», но почему?

Тернарный оператор

var experiencePoints = winBattle() ? 10 : 1;

Error

VM363: 1 Uncaught ReferenceError: winBattle не определен

Моя функция

function experiencePoints() {
    if (winBattle()) {
        return 10;
    } else {
        return 1;
    }
}

И это дает:

undefined

Я хочу получить неопределенное значение, как и в случае с обычной функцией.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Ошибка не в том, что вы использовали троичный оператор.

В сообщении говорится, что JavaScript не может найти функцию с именем "winBattle ()" в любом месте вашего кода - или, по крайней мере, вне текущего scope .

Как мы увидим в этой демонстрации, если вы объявляете такую ​​функцию и заставляете ее возвращать простое логическое «истинное» значение (только для примера), то ошибка приводит кне происходит:

var experiencePoints = winBattle() ? 10 : 1;
console.log(experiencePoints);

function winBattle()
{
  //I assume here you would have some logic to calculate the winner of the battle, and then return true or false depending on who won.
  return true;
}

Вам нужно будет проверить оставшуюся часть кода и либо

a) создать функцию, если она не существует

или

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

Вот некоторая справочная информация:

Я думаю, что вы, возможно, ошиблись undefined you 'мы видим результат выполнения функции «ExperiencePoints».Это не.Это просто результат создания этой функции через консоль.Консоль всегда показывает результат только что созданной строки, которая в данном случае ничего не значит, потому что вы просто объявляете функцию, а не запускаете ничего, что производит вывод.Если вы включите эту функцию на веб-странице, вы не увидите такого сообщения.Вы никогда не запускали эту функцию.Если бы вы это сделали (написав experiencePoints();), вы почти наверняка бы увидели ту же ошибку, касающуюся winBattle (), поскольку во время запуска функции winBattle () не существует.

Разница между этими ваш троичный код оператора состоит в том, что эта строка кода не находится внутри функции и поэтому выполняется немедленно.

0 голосов
/ 02 мая 2019

Они не одинаковы: function experiencePoints выполняется только тогда, когда он вызывается, но вы его не вызываете.Вместо этого вы вводите саму функцию definition , которая ничего не возвращает, и вы видите в консоли undefined.

Присвоение переменной с помощью троичного оператора выполняется на месте(это не определение функции), и поэтому winBattle должно существовать в этот самый момент.Видимо, нет, и поэтому вы получаете ошибку.Если вы просто сделаете это:

var a = Math.random() > 0.5 ? 10 : 1

Вы не получите ошибку, потому что определено Math.random.Также вы увидите undefined в консоли, что является нормальным для оператора, например var.

Возвращаясь к function experiencePoints: вы можете удивиться, почему вы не получаете ту же ошибку оwinBattle там.Это потому, что функция еще не выполнена .

Пока вы на самом деле не позвоните , у вас все еще есть время для определения winBattle.Однако, если вы решите вызвать его без предварительного определения winBattle, вы получите ту же ошибку.

Теперь вы, конечно, можете использовать троичный оператор в функции - это было бычестное сравнение.Вы можете выбрать один из нескольких синтаксисов.Вот два из них:

function experiencePoints {
    return winBattle() ? 10 : 1;
}

или в виде функции стрелки с синтаксисом выражения:

var experiencePoints = () => winBattle() ? 10 : 1;

Опять же, здесь вы получите сообщение об ошибке winBattle только при вызове функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...