2014-09-10 15 views
0

我发现很难遵循这个return语句的执行流程。如果任何人都可以解释其执行流程是如何工作的,甚至可以更好地解释创建如此复杂的语句的优点和缺点,而不是更具可读性的多行语句,我会非常满意。解释下面的复杂JavaScript返回语句的执行流程

return option = option ? option : {}, typeof option.xValue == "boolean" && (_ready = option.xValue), option.name && _ready == !1 && log(option.name + "(" + option.caller + ") API not ready.", "E"), _ready 
+4

明显的骗局:它很混乱。 – Barmar 2014-09-10 15:46:13

+4

除非你想确定没有人愿意接受你的工作,然后维持你的计划,否则没有专业人士。严重的是,这是不当行为。 – 2014-09-10 15:47:07

+0

如果你真的需要做一个声明(不知道为什么,也许你的编辑器打破了,当你在一个函数中打10个语句?),然后至少将它分散在几个缩进的行,使其可读。 – 2014-09-10 15:49:35

回答

1

表达式使用逗号操作者来对多个语句,和&&操作者作为if表达短路操作。

您可以编写代码:

if (!option) { 
    option = {}; 
} 
if (typeof option.xValue == "boolean") { 
    _ready = option.xValue; 
} 
if (option.name && _ready == false) { 
    log(option.name + "(" + option.caller + ") API not ready.", "E") 
} 
return _ready; 

写它作为一个复杂的表达式的唯一好处是,它是一个复杂的表达式。想要这样做的原因可能是使代码难以阅读,或者可能稍微短一些。

+0

谢谢,那么||是什么短路?运营商。我在其他地方发现了这个: me.myfunc(调用者)|| (txt ='“caller”argumant is not alphanumeric。',isOK =!1) – Abtin 2014-09-10 16:06:56

+0

“||”运算符评估第一个操作数,如果它是虚假的,它将计算第二个操作数。你可以这样写:if(!me.myfunc(caller)){txt ='“caller”argumant不是字母数字。 isOK = false; }'。 – Guffa 2014-09-10 17:25:31

0

使用operator precedence table以确定表达所有的运营商应该如何进行分组:

return 
    option = 
     option ? option : {}, 
    typeof option.xValue == "boolean" && 
     (_ready = option.xValue), 
    option.name && 
     _ready == !1 && 
      log(option.name + "(" + option.caller + ") API not ready.", "E"), 
    _ready 

逗号操作符分隔每个参数的评估每个表达式,并返回最右边的一个。所以首先它执行option分配。然后它会评估&&表达式中的每一个,这些表达式可能会分配给_ready或致电log()。然后它最终返回值_ready

我不认为他实际上需要围绕_ready任务的括号,他给我们带来了一块骨头。

写这么复杂的陈述没有实际的理由。这样做的人只是试图展示他们是多么聪明,恕我直言。请参阅Guffa的重写可理解代码的答案。

+0

谢谢Barmar。你还可以解释什么||在这样的陈述中做了。例如: : 'code' typeof option.xValue ==“boolean”|| (_ready = option.xValue),'code' – Abtin 2014-09-10 16:15:00

+0

“||”运算符从左到右评估其参数,返回第一个真值。所以如果'选择。xValue'是一个布尔值,它将返回'true'并且不执行'_ready'赋值。如果它不是布尔值,它将执行分配。 – Barmar 2014-09-10 16:23:25

+0

很酷,谢谢Barmar – Abtin 2014-09-10 16:26:47