JavaScript半冒号问题

时间:2013-04-02 17:46:36

标签: javascript

我有以下javascript代码

var foo = function () {
   var func = function () {
        var one = 0;
        if (one === 0) {
            alert('func');
        }

    }

    return {
        func: func
    };
}

foo = new foo();
foo.func();

我的上述代码提醒func这很好。现在,当我将对象文字(即return {})更改为跟随

return
{
    func: func
}

然后它不返回任何东西。我知道为什么因为JavaScript在返回结束时添加了半冒号;。所以请暂时保留此部分,让我们回顾一下原始代码。当我将if语句更改为以下

if (one === 0)
{
    alert('func');
}

然后它会提醒func。的 WHY吗。因为在这种情况下,javascript应该在if(one === 0)的末尾添加半冒号,所以我认为它应该返回错误。

等一下,还有更多。现在让我们把注意力转回到顶部的原始代码。现在,当我将内部函数更改为以下

var func = function ()
{
    //code here
}

然后它再次执行此代码并警告func。再次为什么?与外部功能相同。

1 个答案:

答案 0 :(得分:2)

不,在每行末尾都没有插入分号。 The rules are much more complex

  

当程序从左到右解析时,一个令牌(称为   遇到任何产品不允许的违规令牌)   语法,然后在分配之前自动插入分号   如果满足下列一个或多个条件,则会触犯令牌:

     
      
  1. 违规令牌与前一个令牌至少有一个LineTerminator分开。

  2.   
  3. 违规令牌是}。

  4.         

    当程序从左到右解析时,结束时   遇到令牌输入流,解析器无法输入   将输入令牌流解析为单个完整的ECMAScript程序,   然后在输入的末尾自动插入分号   流。当从左到右解析程序时,令牌是   遇到的是一些语法生成所允许的,但是   生产是限制生产,令牌将是第一个   紧随其后的终端或非终端的令牌   限制生产中的注释“[此处没有LineTerminator]”   (因此这样的令牌被称为限制令牌),并且   受限令牌与前一令牌分开至少一个   LineTerminator,然后在分号前自动插入分号   限制令牌。但是,还有一个更重要的条件   在前面的规则:如果是,则永远不会自动插入分号   然后分号将被解析为空语句或者如果那样   分号将成为一个标题中的两个分号之一   声明(第12.6.3节)。

ECMAScript规范给出了这个建议:

  

对ECMAScript程序员提出的实用建议是:

     

后缀++或 - 运算符应与其出现在同一行   操作数。

     

应该从return或throw语句开始表达式   与return或throw标记相同的行。

     

休息时的标签   continue语句应该与break或continue在同一行   令牌。

但真正实用的事情要记住它是复杂的,所以你自己附上分号,不要讨厌错误。