为什么JavaScript在else之后没有为条件块提供任何错误?

为什么JavaScript在else之后没有为条件块提供任何错误?,javascript,interpreter,Javascript,Interpreter,这听起来可能很奇怪,但我意外地为else子句设置了条件,Javascript并没有给出任何错误。由于这个原因,我花了一些时间才找到问题。这是代码 // no discount if(seo_price <= 0 && web_discount <= 0) { set_result_price(result_msg[0], total_price); } else if(seo_price > 0 &

这听起来可能很奇怪,但我意外地为else子句设置了条件,Javascript并没有给出任何错误。由于这个原因,我花了一些时间才找到问题。这是代码

    // no discount
    if(seo_price <= 0 && web_discount <= 0)
    {
        set_result_price(result_msg[0], total_price);
    }

    else if(seo_price > 0 && web_discount == 0)
    {
        msg = result_msg[0].concat(' ',result_msg[1],' ',result_msg[3]);
        set_result_price(msg, total_price * double_discount + seo_price, total_price + seo_price);
    }

    else if(seo_price == 0 && web_discount > 0)
    {
        msg = result_msg[0].concat(' ',result_msg[1],' ',result_msg[2]);
        set_result_price(msg, total_price * double_discount, total_price);
    }

    else(seo_price > 0 && web_discount > 0)
    {
        web_discount = total_price * ((100 - web_discount)/100) + seo_price;
        double_discount = total_price * double_discount + seo_price;
        
        if(web_discount < double_discount)
        {
            msg = result_msg[0].concat(' ',result_msg[1],' ',result_msg[2]);
            set_result_price(msg, web_discount, total_price + seo_price);
        }
        else
        {
            msg = result_msg[0].concat(' ',result_msg[1],' ',result_msg[3]);
            set_result_price(msg, double_discount, total_price + seo_price);
        }
    }
//不打折
如果(seo_价格0)
{
msg=结果消息[0]。concat(“”,结果消息[1],“”,结果消息[2]);
设置结果价格(消息、总价*双倍折扣、总价);
}
其他(搜索引擎优化价格>0和网络折扣>0)
{
网络折扣=总价格*((100-网络折扣)/100)+搜索引擎优化价格;
双倍折扣=总价*双倍折扣+seo价格;
if(网络折扣<双倍折扣)
{
msg=结果消息[0]。concat(“”,结果消息[1],“”,结果消息[2]);
设置搜索结果价格(消息、网络折扣、总价+搜索引擎优化价格);
}
其他的
{
msg=result\u msg[0]。concat(“”,result\u msg[1],“”,result\u msg[3]);
设置搜索结果价格(消息、双倍折扣、总价+搜索引擎优化价格);
}
}
为什么
else(seo\u price>0和&web\u折扣>0)
不会抛出错误


如果这是一种语言惯例,Javascript本身就使用了隐式分号,那么编程就不可能了

不完整的
if。。其他的如果代码中的
构造没有抛出错误,因为它在使用特定缩进约定时是有效的JavaScript

任何JS表达式都可以单独出现在一行上,不需要存储或使用结果。当开始的大括号位于自己的行上时,JavaScript ASI(自动分号插入)在孤立表达式之后终止
else
,并且不管
if.的结果如何,代码块都将被执行。。else

值得注意的是,
if
else
不提供代码块的使用。如果省略该块,则只有关键字后的下一条语句作为
If
else
的一部分执行。下一个是完全有效的JS:

if (x === true)
    doTrue();
else
    doFalse();

// Also a lonely else after if would be fine, the semicolon represents the empty statement
else;
代码中发生的是下一步:

if(seo_price == 0 && web_discount > 0)
{
    ...
}
else (seo_price > 0 && web_discount > 0);
{ ... } //                              ^-- A semicolon added by ASI
//                                          The former parenthed expression is valid JS

这一行是错误的
else(seo\u price>0和&web\u折扣>0)
“因此,我花了一些时间来发现问题”-那么问题是什么呢?我认为这是一个好问题,问题结束了是不公平的。蒂姆的解释也很好。我喜欢在同一行开始我的第一个花括号,如:。这将导致错误。在新行上打开大括号时,如:将不会导致错误。基于此,你可以说在同一行上打开花括号是最好的做法。我看到了你对问题的编辑。要评论这个编辑,我要说的是,使用JS编程并不是不可能的,它是一个特性,当你知道它的时候,你可以接受它。不过,如果该功能有用的话,这是有争议的。在您的例子中,缺少错误是由于使用了缩进。我建议您在编写JS时使用。这是JS开发人员中最适合的缩进样式,使用这种缩进样式可以最好地避免语言中的一些陷阱(其中许多与ASI有关)。您的回答没有解释为什么
else
接受
(seo\u price>0和&web\u折扣>0)
条件。否?“任何JS表达式都可以单独出现在一行上”是这样的解释。该表达式(您称之为条件,但它只是包含在parentehes中的两个表达式,作为单个表达式进行计算)类似于
“use strict”它不会在不支持严格模式的旧JS引擎中触发错误,因为字符串只是一个表达式,并且在旧引擎中按原样进行计算,没有所述字符串在现代浏览器中的副作用。@Fazliddin我已经更新了答案,现在可能更容易理解了。虽然说的是
if(condition)语句1[其他声明2]
,此处的声明。