網站搜尋

javascript - VSCode 如果省略大括號時縮排


在 VSCode 中,當寫 JavaScript/TypeScript 時,我經常寫沒有花括號的 if 語句。特別是用於提前退出的情況。

foo() {
  ...
  if(...) 
     return;
  ...
  for(...) {
    ...
    if(...)
      continue;
    ...
  }
  ...
}

在 VSCode 中,我在新行上輸入的 return/continue/其他符號不會自動縮排。這有相關的設定嗎?

我只有圖示和 Chrome 延伸功能的偵錯工具。

這是 VSCode 格式化的方式:

事實上,結果發現這並不是唯一出現的奇怪縮排!

這看起來還可以:

但是,如果我將參數放在不同的行上。(對於較長的變數名稱可能是必需的):

那個函數的其餘部分最終會被縮排,檔案的其餘部分也是如此。

我已經嘗試重新安裝 VSCode,但沒有幫助。

有什麼建議嗎?

答案#1

這不會回答你如何讓 VS Code 做你想要的事情的問題,但如果我可以給一些建議:省略大括號可能是危險的。它導致了蘋果在 SSL 實現中的重大安全漏洞:臭名昭著的 goto fail 錯誤。

這是他們遇到問題的程式碼:

if ((err = SSLFreeBuffer(&hashCtx)) != 0)
    goto fail;
if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0)
    goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &clientRandom)) != 0)
    goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
    goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
    goto fail;
    goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
    goto fail;

看到問題了嗎?

大括號不能對這種錯誤提供 完美 的保護,但它們確實有幫助。使用大括號時,你出現自己的 goto fail 錯誤的可能性會大大降低。

一些開發者,包括我自己,認為只有在你將 if 陳述式寫成單行時,省略大括號是可以的。如果你只是想從函數中及早退出,這樣做是沒問題的:

if( ... ) return;

當它寫在單行時,你產生 goto fail 錯誤的機會會小得多。但一旦你將它拆成兩行,就必須使用大括號:

if( ... ) {
    return;
}

或 :

if( ... ) {
    console.log( 'debug message' );
    return;
}

讓我們試試去掉大括號的版本。首先我們有:

if( ... )
    return;

別擔心,這段程式碼如預期運作。現在讓我們加入除錯訊息:

if( ... )
    console.log( 'debug message' );
    return;

哎呀!

既然你已經把開括號放在與if語句同一行了(我完全同意這樣做),那麼再加上關閉括號只會多費一行。要麼把你的早期返回寫成單行,要麼使用大括號。這將避免你自己最終出現goto fail錯誤的風險。