当返回语句和对象之间有换行符时,Javascript函数无法返回对象?
这是你的电话号码 完整代码:当返回语句和对象之间有换行符时,Javascript函数无法返回对象?,javascript,Javascript,这是你的电话号码 完整代码: function foo1(){ return {msg: "hello1"}; } function foo2(){ return {msg: "hello2"}; } // output = "foo1 = {"msg":"hello1"}" console.log('foo1 = ' , JSON.stringify(foo1())); //output = " foo2 = undefined " console.log('
function foo1(){
return {msg: "hello1"};
}
function foo2(){
return
{msg: "hello2"};
}
// output = "foo1 = {"msg":"hello1"}"
console.log('foo1 = ' , JSON.stringify(foo1()));
//output = " foo2 = undefined "
console.log('foo2 = ' , JSON.stringify(foo2()));
两者之间的区别在于,在foo2中,
{msg:'hello'}
在它自己的新行中。我希望解析器忽略空白?tl;dr换行导致第二个函数中出现“未定义”。JavaScript在很多情况下不需要分号,只在某些上下文中使用分号()
在某些情况下,为了避免ASI问题并出于美学原因,我使用了所谓的。例如,使用模板DSL(它将数组作为s表达式编译为HTML),我喜欢对数组进行分组,以便它们清楚地显示HTML结构:
return (
["ul"
, ["li"
, ["span", {class: "name"}, this.name]
, ["span", {id: "x"}, "x"]
]
]
);
在我看来,这似乎比
return [
"ul",
[
"li",
["span", {class: "name"}, this.name],
["span", {id: "x"}, "x"]
]
];
它们的行数是一样的。但这是一个美学问题,真的
分组运算符只计算其中的任何表达式。您通常可以在中看到这一点,您需要将通常的函数声明转换为表达式,然后可以立即调用该表达式(因此,名称)。然而,分组运算符的一个鲜为人知的特性是,它还可以采用逗号分隔的表达式列表,例如
function() {
return (
doSideEffects(),
console.log("this is the second side effect"),
1 + 1
);
}
在本例中,它计算这些表达式中的每一个,并仅返回最后一个(1+1)。接受的答案似乎是正确的 但是,我发现在函数arg开口括号处带有换行符的返回线的这种变体确实有效:
myFunction(){
return myOtherFucntion(
myArg);
}
在“.”之前带有换行符的另一个变体点运算符也起作用:
myFunction(){
return myObject
.myObjectFunction();
}
(我的例子的风格/可读性显然有点奇怪,但试着只关注它们得出的结论,并在你觉得合适的时候运用你自己的风格) 我不相信返回语句,我记得在某处读到过它,这是JS中很少有空格起作用的情况之一。可能重复检查此链接:某些空格。任何数量的普通ASCII空格都可以,但不允许使用单个LF/CR。这似乎是武断的,但我想这是一个合乎逻辑的解释,为什么我昨晚在这件事上浪费了一个小时。林特的错误信息本可以更准确/更有用…作为一个好规则。。。在JavaScript中始终将return语句保留在一行。更糟糕的是,Chrome/Firefox解释行尾的方式与IE解释行尾的方式存在解析差异。相关:@JonB:there?你能举一些例子吗?ASI应该被废除。除了遗留代码之外,它没有存在的理由<代码>返回\n(exp)代码>的工作原理应与
var foo=\n(exp)相同代码>