我有以下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
。再次为什么?与外部功能相同。
答案 0 :(得分:2)
不,在每行末尾都没有插入分号。 The rules are much more complex:
当程序从左到右解析时,一个令牌(称为 遇到任何产品不允许的违规令牌) 语法,然后在分配之前自动插入分号 如果满足下列一个或多个条件,则会触犯令牌:
违规令牌与前一个令牌至少有一个LineTerminator分开。
- 醇>
违规令牌是}。
当程序从左到右解析时,结束时 遇到令牌输入流,解析器无法输入 将输入令牌流解析为单个完整的ECMAScript程序, 然后在输入的末尾自动插入分号 流。当从左到右解析程序时,令牌是 遇到的是一些语法生成所允许的,但是 生产是限制生产,令牌将是第一个 紧随其后的终端或非终端的令牌 限制生产中的注释“[此处没有LineTerminator]” (因此这样的令牌被称为限制令牌),并且 受限令牌与前一令牌分开至少一个 LineTerminator,然后在分号前自动插入分号 限制令牌。但是,还有一个更重要的条件 在前面的规则:如果是,则永远不会自动插入分号 然后分号将被解析为空语句或者如果那样 分号将成为一个标题中的两个分号之一 声明(第12.6.3节)。
ECMAScript规范给出了这个建议:
对ECMAScript程序员提出的实用建议是:
后缀++或 - 运算符应与其出现在同一行 操作数。
应该从return或throw语句开始表达式 与return或throw标记相同的行。
休息时的标签 continue语句应该与break或continue在同一行 令牌。
但真正实用的事情要记住它是复杂的,所以你自己附上分号,不要讨厌错误。