【问题标题】:Why this ternary operator are not working ? is not ternary operator are functions?为什么这个三元运算符不起作用?不是三元运算符是函数吗?
【发布时间】:2019-05-02 20:07:10
【问题描述】:

我刚刚了解了三元运算符,但它并没有像我预期的那样运行。如果发现它真的很混乱。我一遍又一遍地在控制台中收到错误,我不明白为什么。

一个正常的函数给我undefined,这很好,但是三元运算符给我一个“未定义”的错误,但是为什么?

三元运算符

var experiencePoints = winBattle() ? 10 : 1;

错误

VM363:1 Uncaught ReferenceError: winBattle is not defined

我的功能

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

它给出了:

undefined

我想像普通函数一样得到未定义。

【问题讨论】:

  • winBattle 在哪里声明?你打电话给experiencePoints了吗?
  • 您是否在任何地方声明过function winBattle()?如果不是,那么这就是你的错误的原因。它与三元运算符的使用没有直接关系。
  • 如果你打电话给experiencePoints()会发生什么?
  • 该错误意味着winBattle 在您尝试访问它的范围内不存在。除了指出这一点,我们无能为力。如果您发布一个包含winBattle 声明的完整示例,我们可能会判断您是否出错了。
  • 你有一个错误,因为你的系统说没有定义函数 winBattle,而不是因为你使用三元运算符。错误信息一目了然,为什么不想按原样阅读呢?

标签: javascript ecmascript-6


【解决方案1】:

错误不是因为你使用了三元运算符。

消息告诉您,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 误认为是执行“experiencePoints”函数的结果。它不是。它只是通过控制台创建该函数的结果。控制台始终显示您刚刚创建的行的结果,在这种情况下什么都不是,因为您只是在声明一个函数,而不是运行任何产生输出的东西。如果您在网页中包含该功能,您将不会看到这样的消息。您从未真正运行过该功能。如果你这样做了(通过写experiencePoints();),你几乎肯定会看到与 winBattle() 相关的相同错误,因为在你运行该函数时,winBattle() 不存在。

这与你的三元运算符代码的区别在于,这行代码不在函数内,因此会立即执行。

【讨论】:

  • @Pilan 这只会使函数的结果为 false-y,因此三元组将返回 1 而不是 10。不确定这对示例有什么影响,但感谢您的建议
  • 绝对正确,但他想要undefined 结果:D
  • @Pilan 是的......请求的那部分对我来说真的没有任何意义。为什么有人希望函数返回未定义?我看不出这真的有用,尤其是在所示的上下文中。应该根据 winBattle() 的结果做出双向决定,因此这向我表明 winBattle() 应该返回一个布尔值。因此,虽然这在技术上可能是所要求的结果,但我认为这不是一个明智的结果。
  • 问题中仍有相当多的地方没有真正......由这个答案解决。例如,显然他们的“工作”函数返回未定义,这就是他们希望三元版本做的事情。这……当然没有意义。
  • @KevinB 他们可能正在浏览器的控制台中运行此代码。这解释了undefined 位
【解决方案2】:

两者不一样: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 的错误。

【讨论】:

  • 在调用函数的三元组中不是winBattle()吗? o_0
  • 你说他没有打电话,但他是:winBattle() ? 10 : 1; 还是我错过了什么?
  • 你错过了一些东西。我说的是function,而不是任务。 OP 仅定义函数experiencePoints,但不执行它。
  • 是的,好的,我明白你在说什么。函数声明发生的部分不被执行。明白了:) - 所以可能只是缺少一个包含?
猜你喜欢
  • 2013-09-17
  • 2020-11-05
  • 2016-03-30
  • 2016-05-03
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多