非必要的簡略:一個 switch case 讓我重新思考 {} 的必要性

更新 發佈閱讀 5 分鐘

一天,我想更新一段看起來「再普通不過」的 JavaScript,我想新增個error的case,並且設置message變數:

switch (status) {
case 'success':
const message = 'OK';
console.log(message);
break;

//新增的code
case 'error':
const message = 'Fail';
console.log(message);
break

}

結果,專案直接噴錯。

SyntaxError: Identifier 'message' has already been declared


當下的我滿臉問號:

「這不是很正常的寫法嗎?」

直到我意識到一件事——

👉 switch case 其實沒有你想像中的「區塊作用域」。


case,其實不是一個 block

很多人(包含我)會直覺認為這樣:

case 'success':  // 一個 scope
case 'error': // 另一個 scope

但實際上,JavaScript 不是這樣運作的。

👉 switch 裡的所有 case共用同一個作用域(scope)

所以你其實寫了兩次:

const message = 'OK';const message = 'Fail';

然後 JavaScript 很合理地炸給你看。


修正方式很簡單

只要加上 {},事情就解決了:

switch (status) { 
case 'success': {
const message = 'OK';
console.log(message);
break;
}
case 'error': {
const message = 'Fail';
console.log(message);
break;
}
}

這個 {} 的意義不是「排版」,而是 建立 block scope

可怕的是:這種 bug 很「隱性」

不像語法錯誤會立刻報錯,有些情況甚至會:

  • 在某些 case 才出現
  • 在 refactor 後才爆
  • 或被其他變數名稱影響

這讓它變成一種典型的:

👉 「看起來沒問題,但其實很危險」的寫法


可讀性其實也在偷偷變差

很多人會覺得省略 {} 比較乾淨:

case 'success':
doSomething();
doAnotherThing();
break;

但當邏輯變多時:

  • 範圍變得不明確
  • 更容易漏 break
  • 更難做局部 refactor

ESLint 其實早就幫你踩煞車了

如果你有用 ESLint,很可能已經看過這個警告:

Unexpected lexical declaration in case block

對應規則是:

{  "rules": {    "no-case-declarations": "error"  }}

👉 它在告訴你一件事:

你應該用 {} 包住 case」

總結

在寫程式的過程中,我們很容易追求一種「簡潔感」——

越少的程式碼、越精簡的寫法,彷彿就代表越高的技術水準。

像是省略 {},乍看之下乾淨俐落,甚至帶點「高手感」。


但實際上,這類非必要的簡略,往往只是把複雜性藏了起來。

它可能帶來:

  • 難以察覺的作用域問題
  • 以及在未來擴充時的潛在限制

這些問題不一定會立刻出現,但一旦發生,往往更難排查,也更難維護。

程式碼的價值,從來不只是「看起來簡潔」,

而是能否在時間的推移下,依然穩定、清晰、可擴展


所以在選擇這些看似酷炫的簡寫時,我們更應該問自己兩個問題

1.這樣的寫法,是否隱藏了我還沒意識到的坑?

2.未來的我(或團隊),能不能輕鬆地在這段程式碼上繼續擴展?

當答案不夠明確時,或許多寫一對 {},反而才是更成熟的選擇。


留言
avatar-img
Shang的 前端開發筆記
4會員
15內容數
歡迎來到我的部落格!這裡是一個分享前端開發、貓咪寫真以及與菲律賓女友生活的文化衝擊與英文學習的個人空間。我熱愛前端技術,喜歡追求最新的網頁開發趨勢,並將這些知識分享給大家。
2026/01/09
在購物車結帳流程中,常會因為導向外部支付頁面而導致 Network 面板刷新,使得剛發出的 Checkout API 請求紀錄消失。為了解決這個問題,Chrome DevTools 提供了 Preserve log 功能。
Thumbnail
2026/01/09
在購物車結帳流程中,常會因為導向外部支付頁面而導致 Network 面板刷新,使得剛發出的 Checkout API 請求紀錄消失。為了解決這個問題,Chrome DevTools 提供了 Preserve log 功能。
Thumbnail
2024/03/21
CatHelper是我開發的前端 SideProject,是貓咪募資收養的一站式平台。 我用戶使用流程、資料庫、頁面來構思這個專案。
Thumbnail
2024/03/21
CatHelper是我開發的前端 SideProject,是貓咪募資收養的一站式平台。 我用戶使用流程、資料庫、頁面來構思這個專案。
Thumbnail
2024/03/14
不同的運算子一起出現時,會根據其優先性(Precedence)來決定誰先誰後。MDN也很貼心的整理成表格了。 雖然有表格可以供我們查找,但是總不可能每一次用到運算子的時候,我們都去查找吧?我們最好對這張表有直觀上的理解與記憶。 那麼就讓我來分享我如何理解與記憶這張表吧! 運算子在做甚麼
Thumbnail
2024/03/14
不同的運算子一起出現時,會根據其優先性(Precedence)來決定誰先誰後。MDN也很貼心的整理成表格了。 雖然有表格可以供我們查找,但是總不可能每一次用到運算子的時候,我們都去查找吧?我們最好對這張表有直觀上的理解與記憶。 那麼就讓我來分享我如何理解與記憶這張表吧! 運算子在做甚麼
Thumbnail
看更多
你可能也想看
Thumbnail
JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。
Thumbnail
JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
本章節旨在介紹JavaScript中函數的基本結構和使用方法,包括函數聲明、函數表達式、箭頭函數和匿名函數的定義方式,以及函數的呼叫、參數使用和返回值的處理方式。透過了解這些函數的基本概念和用法,可以幫助讀者更靈活地編寫和理解JavaScript代碼。
Thumbnail
本章節旨在介紹JavaScript中函數的基本結構和使用方法,包括函數聲明、函數表達式、箭頭函數和匿名函數的定義方式,以及函數的呼叫、參數使用和返回值的處理方式。透過了解這些函數的基本概念和用法,可以幫助讀者更靈活地編寫和理解JavaScript代碼。
Thumbnail
這系列文章會記錄 JS 30 當次挑戰時使用到的語法和相關知識。JS 30 官方有提供所有製作網頁的資源,不需要任何事前準備,就能無痛開始撰寫 JS,寫完之後還有 JS 30 作者提供的解答,不知道怎麼下手時可以參考、寫完之後也能了解更多解法,改善自己的寫法。
Thumbnail
這系列文章會記錄 JS 30 當次挑戰時使用到的語法和相關知識。JS 30 官方有提供所有製作網頁的資源,不需要任何事前準備,就能無痛開始撰寫 JS,寫完之後還有 JS 30 作者提供的解答,不知道怎麼下手時可以參考、寫完之後也能了解更多解法,改善自己的寫法。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News