2016-01-25 39 views
1

我无法弄清楚为什么我不能在三元操作中使用我的for循环。这里要说的是不工作的代码:Javascript三元w/for循环错误; “Uncaught SyntaxError:意外的令牌”

this.ask = function() { 
    m = (isVoice) ? 'voice' : 'text'; 
    switch (true) { 
    case m == 'voice' && typeof questions[timer.question].voice == 'string': 
     (++timer.attempts > timer.maxAttempts) ? 
     console.log('Stop'): 
     console.log('Play file (' + timer.attempts + '): ' + questions[timer.question].voice); 
     break; 
    case m == 'voice' && typeof questions[timer.question].voice == 'object': 
     (++timer.attempts > timer.maxAttempts) ? 
     console.log('Stop'): 
     for (i = 0; i < questions[timer.question].voice.length; i++) { 
      console.log(questions[timer.question].voice[i]) 
     }; 
     break; 
    default: 
     (++timer.attempts > timer.maxAttempts) ? 
     console.log('Stop'): 
     console.log('Say Text (' + timer.attempts + '): ' + questions[timer.question].text); 
     break; 
    } 
}; 

具体的的情况下,其中m ==“声音”和typeof运算==“对象”引发错误“未捕获的SyntaxError:用于意外标记”。如果我将该情况更改为:

case m == 'voice' && typeof questions[timer.question].voice == 'object': 
      console.log('Audio, Array.'); 
      if (++timer.attempts > timer.maxAttempts) { 
       console.log('Stop'); 
      } 
      else { 
       for (i in questions[timer.question].voice) { 
        console.log(questions[timer.question].voice[i]); 
       } 
      } 
      break; 

...然后一切按预期工作。

这是为什么?

+0

在您需要使用返回一些值,循环不会返回任何表情三元。 – sergioFC

+1

三元运算符可以非常方便,但它也为无法读取的意大利面代码留下了空洞。在我的愚见中,这是其中的一例。我不会推荐以这种方式编写代码。使用'if'。 – Timeout

+0

我和许多人指出的一样......简单的if/else语句以获得更简洁的代码。谢谢大家的意见。谢谢Pointy解释问题所在。 – cw84

回答

2

三元运算符的语法期望“分支”是表达式。你不能只在那里发表任何陈述;在JavaScript中,for循环是而不是的表达式。

你可以将循环包装在一个函数中并调用它,但是使用普通的if语句会简单很多。

+3

我还会添加:“和更清晰” –

0

如果你把你的for循环放在括号里,它可能会起作用。

function() { 
    for (i = 0; i < questions[timer.question].voice.length; i++) { 
    console.log(questions[timer.question].voice[i]) 
    } 
}() 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

但风格上你真的推信封...

+0

这也是一个语法错误。事实上,也是基于同样的原因。一旦你用'('开始语句,唯一可以遵循的就是一个表达式,而'for'不是可以启动表达式的一部分的标记。 – Pointy

+0

正确。@Pointy先前说明了唯一可以实现的方法这将是一个立即执行的匿名函数。 – voam

相关问题