为什么这个三元运算符不起作用?函数不是三元运算符吗?

时间:2019-05-02 20:07:11

标签: javascript ecmascript-6

我刚刚了解了三元运算符,但是它的运行不像我预期的那样。如果发现它确实令人困惑。我一遍又一遍地在控制台中收到一个错误,但我不明白为什么。

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

三元运算符

var experiencePoints = winBattle() ? 10 : 1;

错误

  

VM363:1未被捕获的ReferenceError:未定义winBattle

我的功能

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

它给出了:

undefined

我想像普通函数所给出的那样不确定。

2 个答案:

答案 0 :(得分:2)

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

该消息告诉您JavaScript无法在代码中的任何位置找到一个名为“ winBattle()”的函数-至少在当前scope中找不到。

我们将在本演示中看到,如果您声明了这样的函数,并使其返回简单的布尔“ true”值(例如),则不会发生错误:

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”功能的结果。它不是。只是通过控制台 creating 起作用的结果。控制台始终显示您刚刚创建的行的结果,在本例中为空,因为您只是声明一个函数,而不运行任何会产生输出的结果。如果您将该功能包含在网页中,则不会看到这样的消息。您从未真正运行过该功能。如果这样做了(通过编写experiencePoints();),几乎可以肯定会看到与winBattle()有关的相同错误,因为在运行函数时,winBattle()不存在。

该代码与您的三元运算符之间的区别在于该代码行不在函数内,因此可以立即执行。

答案 1 :(得分:0)

两者是不同的:def __init__(self, nv, nh): self.W = torch.randn(nv, nh) # was torch.randn(nh, nv) self.a = torch.randn(1, nh) self.b = torch.randn(1, nv) def sample_h(self, x): wx = torch.mm(x, self.W) # was torch.mm(x, self.W.t()) activation = wx + self.a.expand_as(wx) p_h_given_v = torch.sigmoid(activation) return p_h_given_v, torch.bernoulli(p_h_given_v) def sample_v(self, y): wy = torch.mm(y, self.W.t()) # was torch.mm(y, self.W) activation = wy + self.b.expand_as(wy) p_v_given_h = torch.sigmoid(activation) return p_v_given_h, torch.bernoulli(p_v_given_h) 仅在调用时执行,但您没有调用它。取而代之的是您输入函数 definition 本身,该函数不返回任何内容,因此您会在控制台中看到function experiencePoints

使用三元运算符进行的变量赋值是在现场执行的(它不是函数定义的 ),因此此时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; 的错误。