以下是jsfiddle
完整代码:
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'}
位于其自己的新行中。我期待解析器忽略空格?
答案 0 :(得分:26)
tl; dr 换行符导致第二个函数中的'undefined'。 JavaScript在很多情况下不需要分号,只是在某些上下文中假设它们(Automatic Semicolon Insertion)。
在某些情况下,为了避免这个ASI问题而且出于审美原因,我使用了所谓的grouping operator。例如,使用hoquet模板化DSL(它将Arrays作为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"]
]
];
他们最终会得到相同数量的线条。但这确实是一个美学问题。
分组运算符只是评估其中的任何表达式。您通常会在Immediately Invoked Function Expressions中看到这一点,您需要将通常为函数声明的内容转换为表达式,然后可以立即调用它(因此,名字)。但是,分组运算符的一个可能鲜为人知的特性是它也可以采用逗号分隔的表达式列表,例如
。function() {
return (
doSideEffects(),
console.log("this is the second side effect"),
1 + 1
);
}
在这种情况下,它会评估每个表达式并仅返回最后一个(1 + 1)。
答案 1 :(得分:0)
接受的答案似乎是正确的。
但是我发现这个带有换行符的返回行的变体在一个函数arg开口括号上工作:
myFunction(){
return myOtherFucntion(
myArg);
}
这个其他变体在'之前有换行符。'点运算符ALSO的工作原理:
myFunction(){
return myObject
.myObjectFunction();
}
(我的例子的风格/可读性显然有点奇怪,但试着只关注他们做出的结论,并在你认为合适时运用你自己的风格)。