-6

我有以下 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为什么?. 因为在这种情况下,javascript也应该在末尾添加分号,if(one === 0)所以我认为它应该返回错误。

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

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

然后它再次执行此代码并发出警报func。为什么外部功能也是如此。

4

1 回答 1

2

不,分号不会插入到行的每一端。规则要复杂得多

当从左到右解析程序时,遇到任何语法生成都不允许的标记(称为违规标记)时,如果出现以下一项或多项,则在违规标记之前自动插入分号条件为真:

  1. 违规标记与前一个标记至少由一个 LineTerminator 分隔。

  2. 有问题的令牌是 }。

当程序从左到右解析时,遇到输入令牌流的结尾,并且解析器无法将输入令牌流解析为单个完整的 ECMAScript 程序,则在末尾自动插入分号输入流。当程序从左到右解析时,遇到某个语法产生式允许的记号,但产生式是受限制的产生式,并且该记号将是紧跟注释之后的终端或非终端的第一个记号“[no LineTerminator here]”在受限生产中(因此这样的令牌称为受限令牌),并且受限令牌与前一个令牌至少有一个 LineTerminator 分开,然后在受限标记之前自动插入一个分号。但是,前面的规则还有一个额外的覆盖条件:如果分号随后将被解析为空语句,或者如果该分号将成为 for 语句标题中的两个分号之一(部分12.6.3)。

ECMAScript 规范给出了这个建议:

给 ECMAScript 程序员的实用建议是:

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

return 或 throw 语句中的 Expression 应与 return 或 throw 标记在同一行开始。

break 或 continue 语句中的标签应与 break 或 continue 标记位于同一行。

但是要记住的真正实际的事情是它很复杂,所以自己附加分号,不要乞求错误。

于 2013-04-02T17:48:51.037 回答