Javascript JSHint奇怪的行为

Javascript JSHint奇怪的行为,javascript,Javascript,我想我应该问关于jSHint的新问题,讨论开始了,我现在可以看到jSHint发出的奇怪警告,我只是想知道为什么 有人建议 因此,我在JSHint中有以下代码: var foo = function() { return { hi: console.log("foo") } //line 15 <------ why we have to put ; here? }; var foo1 = function() { return //

我想我应该问关于jSHint的新问题,讨论开始了,我现在可以看到jSHint发出的奇怪警告,我只是想知道为什么

有人建议

因此,我在JSHint中有以下代码:

var foo = function() {
   return {
       hi: console.log("foo")
   } //line 15 <------ why we have to put ; here?
};

var foo1 = function() {
    return // i know about ; here, please read post
    {
        hi: console.log("foo1")
    }; // line 22 <---- why we don't need to put ; here?
};
var foo=function(){
返回{
嗨:console.log(“foo”)
}//第15行2件事,首先是这里

return {
       hi: console.log("foo")
   } 
您需要
在此处指定对象文字的结尾和

 return
    {
        hi: console.log("foo1")
    };

因为您没有将
{
放在
return
之后,所以js引擎会为您放置一个
(可选分号).

您的第一个示例以您期望的方式运行。该函数将返回一个具有
hi
属性的对象。
return
语句包含一个可选表达式,必须以分号结尾(通过自动插入分号显式或隐式).JSHint默认情况下更喜欢显式分号,因此指出您遗漏了一个分号

第二个示例的运行方式与您预期的不同。函数将返回
未定义的
。原因是解析器认为
return
语句后面没有表达式。这是因为语法有点模糊,允许自动插入分号。此示例被解析为n空
return
语句后跟一个块。块不需要以分号结尾,因此JSHint指出第二个示例中使用的分号是不必要的。

分号应该跟在语句后面。它们不需要跟在块后面。例如,这里有一个不必要的分号,带有
if

if(foo === bar) {
    //...
};
if
块后面的分号是不必要的

这与您的大小写有什么关系?好吧,有时
{…}
是一个块,有时
{…}
是一个对象文字。周围的上下文让语法确定它是哪个。在第一种情况下,它是一个对象;在第二种情况下,它是一个块

同一行上
return
语句后面的字符被解析为表达式。当
{…}
被解析为表达式时,它是一个对象文本。在第一个示例中,
return{…}
是一个带有对象表达式的返回语句。它应该有一个终止分号,因为它是一个语句

这里需要了解的关键是ECMAScript语法不允许使用换行符来分隔
返回
及其返回值表达式

报表[收益率]:

  • return
    [此处无行终止符]表达式
  • 返回
    [此处无行终止符]表达式[In,?Yield]
return语句在
return
和表达式之间不能有行终止符

由于您的
return
{…}
之间确实有一个换行符,
{…}
部分不会被解析为属于
return
。它是独立的,这意味着它被解析为一个块。
{…}
只有当序列是较大语句或表达式的一部分时,才能将其解析为对象,如

  • 赋值,
    foo={…}
  • 函数参数(
    bar({…}
  • 返回值(
    返回{…}
  • 等等
{…}
单独在一行上时,它被视为一个块


由于第二种情况有一个块,而不是一个对象,因此它不需要分号,如本答案开头所述。

第15行:您需要semicolon@taj-ahmed hm,我的问题是您的返回语句没有与第22行相同的分号在浏览器控制台或节点REPL中运行这两个函数,并查看其中的差异返回值。然后阅读JavaScript中自动插入分号的内容!为什么我们不在第二个返回中放分号?为什么我们必须在第一个返回中放分号?@alexey第一个大小写由js引擎作为对象文本读取,而在第二个大小写中,它在该行上找到
返回
,后面没有任何内容,因此它添加了
a因此,您的第二个案例最终成为一个代码块问题是:为什么第19行没有错误缺少分号?这是一个返回语句,没有semecolon。那么为什么也没有错误消息?@Qwertiy-啊,我明白了。如果我将有问题的代码粘贴到中,我确实会收到该行的“缺少分号”错误(以及“换行错误”)。关于我们19行的另一个错误:“换行错误'return',不知道为什么,但可以。我的问题是:'optional expression'和'block'之间有什么区别?@alexey-A本身就是一个语句。您可以使用
{/*…*/}
任何允许使用语句的地方。定义对象文本时使用相同的语法。ECMAScript语法必须同时考虑这两种用例。在第一个示例中
{
被解析为一个对象文字的开头。在第二个语句中,它被解析为一个块的开头,因为在
返回后有一个换行符,并且没有显式的分号。如果我们在第二个返回后放置;我们将看到这个警告:在控制台语句上标记“hi”,这意味着什么?@alexey-Since
{…}
这里有一个blcok,
{hi:…}
中的
hi:
是一个:.JSHint可能只是警告您,您在一个无意义的上下文中使用标签——标签只有在循环构造之前使用时才有用,例如
while
。非常感谢!现在我想我有了更好的理解:)@alexey刚刚确认:如果你做了
hi:while(true){}
,警告就会消失。