我认为我应该问关于 jSHint 的新问题,讨论开始了here https://stackoverflow.com/questions/35987052/js-strange-behavior,我现在可以看到来自 JSHint 的奇怪警告,我只是想知道为什么。
这项服务 http://jshint.com/被建议。
所以我在 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?
};
我通过上面的注释“此行”标记了收到警告的行。
那么,问题:
我有两个奇怪的警告:
第一次警告15 Missing semicolon.
约15行
第二次警告22 Unnecessary semicolon.
约22行
但这两条线对我来说看起来是一样的,我错过了什么?为什么我们这里有两个不同的警告?
EDIT
问题不是关于行为,问题是关于警告。为什么它们不同?
我知道我在第二次返回时错过了分号!
后面应该有分号声明。他们不需要跟随blocks。例如,这里有一个不必要的分号if
:
if(foo === bar) {
//...
};
后面的分号if
块从来没有必要。
这和你的案子有什么关系?嗯,有时候{ ... }
是一个块,有时{ ... }
是一个对象字面量。周围的上下文让语法决定它是什么。在第一种情况下,它是一个对象;在第二种情况下,它是一个块。
后面的字符return
同一行上的语句被解析为表达式。什么时候{ ... }
被解析为表达式,它是一个对象字面量。在你的第一个例子中,return { ... }
是带有对象表达式的返回语句。它应该有一个终止分号,因为它是一个语句。
这里要理解的关键是 ECMAScript 语法不允许用换行符分隔return
及其返回值表达式。在里面ES2015 §11.9.1,自动分号插入规则 http://www.ecma-international.org/ecma-262/6.0/index.html#sec-rules-of-automatic-semicolon-insertion:
ReturnStatement[Yield] :
-
return
[no 行终结符 here] 表达 ;
-
return
[no LineTerminator here] Expression[In, ?Yield] ;
A 退货声明不能有一个行终结符之间的字符return
和表达.
自从你do你之间有一个换行符return
和{ ... }
, the { ... }
部分未被解析为属于return
。它是独立的,这意味着它被解析为一个块。这{ ... }
仅当序列是较大语句或表达式的一部分时,才能将其解析为对象,例如
- 任务,
foo = { ... }
- 函数参数(
bar({ ... }
)
- 返回值(
return { ... }
)
- etc.
When { ... }
本身纯粹在一条线上,它被视为一个块。
由于第二种情况有一个块,而不是一个对象,因此它不需要分号,如本答案开头所述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)