解释下面复杂的javascript return语句的执行流程

时间:2014-09-10 15:44:41

标签: javascript

我发现很难遵循此return语句的执行流程。如果有人能够解释它的执行流程是如何工作的,那么如果你能解释创建这样复杂的语句的优点和缺点,而不是更易读的多行​​语句,我会非常感兴趣。

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

2 个答案:

答案 0 :(得分: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;

将其编写为单个复杂表达式的唯一优势是它是一个复杂的表达式。想要这样做的原因可能是让代码更难阅读,或者可能会稍微缩短代码。

答案 1 :(得分: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的答案,重写为可理解的代码。