我刚刚了解了三元运算符,但是它的运行不像我预期的那样。如果发现它确实令人困惑。我一遍又一遍地在控制台中收到一个错误,但我不明白为什么。
一个普通函数给我未定义,这很好,但是三元运算符给我一个“未定义”错误,但是为什么呢?
三元运算符
var experiencePoints = winBattle() ? 10 : 1;
错误
VM363:1未被捕获的ReferenceError:未定义winBattle
我的功能
function experiencePoints() {
if (winBattle()) {
return 10;
} else {
return 1;
}
}
它给出了:
undefined
我想像普通函数所给出的那样不确定。
答案 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;
的错误。