Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当返回语句和对象之间有换行符时,Javascript函数无法返回对象?_Javascript - Fatal编程技术网

当返回语句和对象之间有换行符时,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)相同