簡體   English   中英

當返回語句和對象之間有換行符時,Javascript 函數無法返回對象?

[英]Javascript function fails to return object when there is a line-break between the return statement and the object?

這是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'}位於其自己的新行中。 我期待解析器忽略空格?

tl; dr換行符導致第二個函數中出現“未定義”。 JavaScript 在很多情況下不需要分號,只是在某些上下文中假設它們( 自動分號插入)。


在某些情況下,為了避免這種 ASI 問題並出於美觀原因,我使用了所謂的分組運算符 例如,使用hoquet模板 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();
}

(我的例子的風格/可讀性顯然有點奇怪,但盡量只注意他們得出的結論,並在你認為合適的時候運用你自己的風格)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM