ES6+ 語法與設計模式

2025年7月1日

ES5 vs ES6+

語法項目 ES5 ES6+
變數宣告varlet, const
函式定義function () {}() => {}
字串拼接'Hi ' + name`Hi ${name}`

var / let / const 比較

項目varletconst
作用域函式作用域區塊作用域區塊作用域
可重新指定值✘(但可改物件內容)
可重複宣告
變數提升✔(初始為 undefined)✘(TDZ)✘(TDZ)
tdz 是指在變數宣告之前,變數不能被存取的區域。 如果嘗試在 tdz 範圍內存取變量,會拋出 ReferenceError 錯誤。

為什麼不要用 var

1. 沒有區塊作用域(block scope)

使用 var 宣告的變數不會限制在區塊範圍內,容易造成變數污染:

if (true) {
  var name = "Lan";
}
console.log(name); // "Lan"

2. 存在「變數提升」(Hoisting)

變數會被提升至作用域頂端,但不包含賦值,容易誤會為可用:

console.log(score); // undefined
var score = 100;

改用 let  /  const 的好處

關鍵字特性
let有區塊作用域、無提升、可重新賦值
const有區塊作用域、無提升、不可重新賦值(適合常數)
if (true) {
  let username = "Lan";
  const age = 25;
}

console.log(username); // ReferenceError

補充:那為什麼有時還是看到 var

  • 出現在舊教學或歷史專案中
  • 舊瀏覽器或不支援 ES6 的執行環境
  • 開發者個人習慣(不建議)

實戰建議

使用情境建議關鍵字
可變資料let
常數(不可變)const
任何情況不要用 var

常見設計模式範例

 單例模式(Singleton Pattern)

class Singleton {
  static instance: Singleton
  private constructor() {}

  static getInstance() {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton()
    }
    return Singleton.instance
  }
}

const a = Singleton.getInstance()
const b = Singleton.getInstance()
console.log(a === b) // true

 工廠模式(Factory Pattern)

function createUser(type: string) {
  if (type === 'admin') return { role: 'admin', permission: 'all' }
  return { role: 'user', permission: 'read' }
}

const admin = createUser('admin')
const user = createUser('user')

 觀察者模式(Observer Pattern)

class Subject {
  observers: Function[] = []

  subscribe(fn: Function) {
    this.observers.push(fn)
  }

  notify(data: any) {
    this.observers.forEach(fn => fn(data))
  }
}

const subject = new Subject()
subject.subscribe(data => console.log('Received:', data))
subject.notify('Hello')

Javascript 進階?參考: TypeScript 的泛型與條件型別應用

© 2025 Frontend Starter Map. Made with ❤️ using Nuxt 3.

有任何問題歡迎來信討論:

a0912383019@gmail.com