Javascript JSHint奇怪的行为
我想我应该问关于jSHint的新问题,讨论开始了,我现在可以看到jSHint发出的奇怪警告,我只是想知道为什么 有人建议 因此,我在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 //
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){}
,警告就会消失。