我在编写一些 JS 代码时注意到一件奇怪的事情。这个编译错误似乎发生在多个浏览器上(已测试:Chrome、IE、Safari)。我并不急于寻求解决方案,但我无法弄清楚为什么这段代码无法编译:
function fooBar1()//Compiles
{
return {
x: 0,
y: 1
};
}
function fooBar2()//Compiles
{
return {x: 0, y: 1};
}
function fooBar3()//Compiles
{
return
{
x: 0
};
}
function fooBar4()//Does not compile
{
return
{
x: 0,
y: 1//Uncaught SyntaxError: Unexpected token :
};
}
最佳答案
这是由于 Javascript 的自动分号插入“功能”。
我将“功能”这个词用引号引起来,因为它真的不是——坦率地说,它有点像灾难;我所知道的最糟糕的语言设计决策之一。
基本上,JS 语言被设计为所有语句都以分号结尾,但最初的语言设计为忘记它的编码人员提供了余地,因此如果它看到没有分号的换行符,它会尝试猜测那里是否应该有一个。
不幸的是,在某些情况下这会导致歧义和错误,而 return
语句可能是最糟糕的。
在您的最后一个示例中,返回对象的 {
在 return
语句之后的行中。这是此类错误的经典案例。 JS 会在return
后自动插入一个分号,而您打算返回的对象将被忽略。
简单的回答:只是不要这样做。始终将对象与 return
语句放在同一行。记住 return
需要返回数据与 return
语句本身位于同一行(或至少从同一行开始)这一事实。
第一个示例显示了您最接近损坏的示例并且仍然可以正常工作。
return {
x: 0,
y: 1
};
作为最后的想法,您可能需要考虑通过像 jsLint 这样的工具来运行您的 JS 代码。 ,它会发现这样的错误(以及其他潜在问题)。
关于JavaScript 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18986144/